半期复习——第二章:进程管理(2.3)

发布时间 2023-04-16 12:43:47作者: 一只朋克小狗

2.3 进程控制(创建,终止,状态转换)一般由OS内核的原语实现

一、操作系统内核

    1.OS内核包含与硬件紧密相关的模块(如中断处理程序),常用设备驱动、运行频率高的模块(如时钟管理、进程调度)。安排在紧靠硬件的软件层次,常驻内存。

    2.OS内核两大功能

        ①支撑功能(中断处理,时钟管理,原语操作)

        ②资源管理功能(进程管理,存储器管理,设备管理)

二、进程的创建

    1.进程的层次结构(Linux):父进程,子进程

    2.引起创建进程的事件

        ①用户登录。在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入就绪队列中。

        ②作业调度。在批处理系统中,当作业调度程序按一定的算法调度到某作业时,便将该作业装入内存,为它分配必要的资源,并立即为它创建进程,再插入就绪队列中。

        ③ 提供服务。当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务。

        ④应用请求。在上述三种情况下,都是由系统内核为它创建一个新进程;而第4类事件则是基于应用进程的需求,由它自己创建一个新进程,以便使新进程以并发运行方式完成特定任务。

    3.进程创建creat()

        ①申请空白PCB,申请pid

        ②为新进程分配资源,从OS或从父进程获得

        ③初始化进程控制块,包括标识信息,处理机状态信息,处理机控制信息

        ④将新进程插入就绪队列

三、进程的终止

     1. 引起终止进程的事件

          ①正常结束

          ②异常结束

          ③外界干预

    2.终止过程

         ①根据被终止进程的标识符ID,从PCB集合中检索出该进程的PCB,从中读出该进程的状态

         ②若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度

         ③若该进程还有子孙进程,还应先将其所有子孙进程予以终止,以防他们成为不可控的进程

         ④将被终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统

         ⑤将被终止进程(它的PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息 

四、进程的阻塞与唤醒

      1.引起进程阻塞的事件 

          ①请求系统服务:提出I/O服务时,并不立即满足该进程的要求时,转变为阻塞状态来等待

          ②启动某种操作:当进程启动某种操作后,在该操作完成之后才能继续执行

          ③新数据尚未到达:对于相互合作的进程而言,交互时

          ④无新工作可做。如发送进程

      2.阻塞过程block()

          ①进程便通过调用阻塞原语block( )把自己阻塞 

          ②阻塞程序把进程控制块中的现行状态由“执行”改为“阻塞”,并将PCB插入阻塞队列

          ③转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换

    3.唤醒过程wakeup()

          相关进程调用wakeup(),把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪 (2)然后再将该PCB插入到就绪队列中 

*block()和wakeup()必须成对使用

五、进程的挂起与激活

    1.suspend():检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪对于活动阻塞状态的进程,则将之改为静止阻塞

    2.active():将进程从外存调入内存,检查该进程的现行状态。 若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞

六、Linux进程控制

    1.进程的创建

int main(void){
  pid_t pid;
  pid=fork();
  if(pid==-1)
  printf(“fork error\n”);
  //在子进程中返回值为0(不合法的PID,提示当前运行在子进程中)
  else if(pid==0){
     printf(“the returned value is %d\n”,pid);
     printf(“In child process!!\n”);
     printf(“My PID is %d\n”,getpid());
  }
  //在父进程中返回值为子进程ID(让父进程掌握所创建子进程的ID号)
  else{
     printf(“the returned value is %d\n”,pid);
     printf(“In father process!!\n”);
     printf(“My PID is %d\n”,getpid());
  }
return 0;
}

     2.进程的退出

          ①exit 是一个函数,执行完后把控制权交给系统

          ②return 是函数执行完后的返回。return 执行完后把控制权交给调用函数 

          ③exit 是正常终止进程;abort 是异常终止进程

          ④_exit 执行后立即将控制权返回给内核;exit 执行后要先执行一些清除操作,然后才将控制权交给内核 

    3.进程的等待与睡眠

          ①孤儿进程

          ②僵尸进程:已经终止但父进程尚未对其调用wait或waitpid函数的进程 

   

          ③wait():父进程一旦调用了wait就立即阻塞自己。如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个子进程出现为止。

    4.进程的执行:exec函数簇