操作系统(七)进程管理——进程控制

进程控制的主要任务:

进程控制是对系统中所有进程从创建、执行到撤销的全过程实行有效的管理和控制。

进程控制一般是由操作系统内核的相应程序(原语)来实现。通常,操作系统内核运行在系统态。

一、原语

原语是由若干条指令组成的,用于完成特定功能的,具有原子性(不可分割)的子程序。它与一般过程的区别:它们是原子操作(Action Operation)为保证操作的正确性,原语在执行期间是不可被中断的。因此,规定在执行原语操作时要屏蔽中断,以保证原语操作的不可分割性。

用于进程控制过程中的原语有:

  • 创建原语(Create)、撤销原语(Termination)
  • 阻塞原语(Block)、 唤醒原语(Wakeup) 
  • 挂起原语(Suspend)、 激活原语(Active)

二、操作系统内核

通常将一些与硬件密切相关的模块、各种常用的设备驱动程序以及运行频率较高的模块安排在仅靠硬件的软件层中,并常驻内存,这部分被称为操作系统内核

1、操作系统这种内核分离设置的目的

  • 便于对这些软件进行保护,防止遭到其他应用程序的恶意破坏;
  • 可提高操作系统的运行效率。

2、操作系统内核的主要功能

  • 支撑功能(中断处理、时钟管理、原语操作)
  • 资源管理(进程管理、存储器管理、设备管理)

从进程管理的角度,操作系统内核主要实现对进程的创建、撤消以及通信管理等功能。

内核是通过执行各种原语操作来实现对进程的各种控制和管理功能的。

三、进程图

进程图是描述一个进程的家族关系的有向树,包括

  • 父(子)进程:创建与被创建的进程
  • →:用于描述进程间父子关系的有向边
  • 祖先进程:创建父进程的进程,相对的,不唯一
  • 祖先:创建所有其他进程的进程,即进程树的根结点,唯一的

下面给出一个进程树的例子:

四、进程控制

1、进程的创建

导致进程的创建有以下四种典型的原因/事件:

  1. 用户登录:用户输入登录命令,系统建立一个进程并把它插入就绪队列。
  2. 作业调度:调度作业后将该作业装入内存,为之分配资源,并创建进程。
  3. 提供服务:用户提出请求后,系统专门提供一个进程供用户使用。
  4. 应用请求:进程为自己那些能并发执行的操作创建新的子进程,使其能并发执行,进而使整个进程能快速完成。

123 根据需要由系统创建新的进程,4由进程自己创建的新进程。

进程的创建过程

  • 申请空白PCB
    • 分配唯一标识符
    • 从PCB集合中取走一个空白的PCB
  • 分配资源
    • 分配程序和数据以及用户栈所需要的内存空间
  • 初始化PCB
    • 将进程的相关信息填入PCB中
  • 插入就绪队列

2、进程的终止

导致进程终止的典型原因/事件:

  • 正常结束(结束标志)
  • 异常结束
    • 越界错误

    • 保护错

    • 非法指令

    • 特权指令错

    • 运行超时

    • 等待超时

    • 算术运算错

    • I/O故障

    如果进程在执行的过程中,发生了以上异常现象中的任何一种,系统都会及时停止这个进程的运行,以防止出现严重的后果。

  • 外界干预
    • 操作员或操作系统干预
    • 父进程请求
    • 父进程终止

 进程终止的过程:

  • 根据进程的标识符,从PCB集合中检索该进程的PCB,并读出进程状态
  • 若处于执行状态,应立即终止该进程的执行,并置调度标志为真,指示该进程被终止后应重新进行调度;

  • 若有子孙进程,应将其所有子孙进程予以终止,以防它们成为无法控制,或者是系统所不能识别的进程;

  • 回收资源并归还(父进程或系统);

  • 从所在的队列中移出被终止进程。(移到空闲队列中

3、进程的阻塞

处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待磁盘数据传输完成、等待其它进程发送消息,当被等待的事件未发生时,由进程自己执行阻塞原语block,使自己由运行态变为阻塞态。可见,进程的阻塞是进程自身的一种主动行为。

进程阻塞过程,如下图:

4、进程的唤醒

当被阻塞进程所期待的事件出现时,例如,当进程提出I/O请求时,进程会进入到阻塞状态,但是不能让这个进程一直处于阻塞状态,等到其I/O操作完成时,那么系统就要采用唤醒原语wakeup唤醒这个处于阻塞的进程,以使它继续执行。

进程唤醒阻塞过程,如下图:

5、进程的挂起和激活

当有引起进程挂起的事件,系统利用挂起原语suspend()将指定进程或者处于阻塞状态的进程挂起。
当有发生激活进程的事件发生,若该进程在外存中已有足够的空间时,可将在外存上处于静止就绪的进程从外存调入内存,系统利用激活原语active()将指定进程激活。

 

进程控制原语与进程状态转换的对应,如下图:

 

posted @ 2019-05-02 11:04  魏亚林  阅读(2658)  评论(0编辑  收藏  举报