进程控制

概述

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

如何实现进程控制

用原语实现:原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可被中断。

假设PCB中的变量stste表示进程当前所属的状态。1表示就绪态,2表示阻塞态。

alt text

假设此时进程2等待的时间发送,则操作系统中,负责进程控制的内核程序至少需要做这两件事:

  1. 将PCB2的state设为1。
  2. 如果收到了中断信号,那么PCB2力的state=1,但是它会被放到阻塞队列里面。
  3. 将PCB2从阻塞队列放到就绪队列。

如何实现原语的原子性

原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。可以用关中断指令开中断指令这两个特权指令实现原子性。

alt text

在正常情况下:CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段陈程序,转而执行相应的中断处理程序。
在CPU执行关中断指令后就不在例行检查中断信号,知道执行打开中断指令之后才会恢复检查。

进程控制相关的原语

无论哪个进程控制的原语,无非要做3件事情:

  1. 更新PCB中的信息
    1. 所有进程控制原语一定会修改进程状态标志。
    2. 剥夺当前运行进程的CPU使用权必然要保存其运行环境
    3. 某进程开始运行之前必然要恢复其运行环境。
  2. 将PCB插入合适的队列。
  3. 分配/回收资源。

进程创建

  • 创建原语:
    • 申请空白PCB
    • 为进程分配所需资源
    • 初始化PCB
    • 将PCB插入就绪队列
  • 引起进程创建的事件
    • 用户登录:分时系统中,用户登陆成功,系统会为其建立一个新的进程
    • 作业调度:多道批处理系统,有新的作业放入内存是,会为其建立和新的进程
    • 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求。
    • 应用请求:有由用户进程主动请求创建一个子进程。

进程的阻塞和等待

  • 进程的阻塞
    • 阻塞原语:
      • 找到要阻塞的进程对应的PCB。
      • 保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程运行。
      • 将PCB插入相应事件的等待队列。
    • 引起进程阻塞的事件:
      • 需要等待系统分配某种资源。
      • 需要等待相互合作的其他进程完成工作。
  • 进程的唤醒:
    • 唤醒原语:
      • 在事件等待队列中找到PCB
      • 将PCB从等待队列移除,设置进程为就绪态。
      • 将PCB插入就绪队列。
    • 引起进程唤醒事件:
      • 等待事件发生。

进程控制相关原语

  • 切换原语:
    • 将运行环境信息存入PCB。
    • PCB移入相应队列。
    • 选择另一个进程执行,并更新其PCB。
    • 根据PCB恢复新进程所需的运行环境。
  • 引起进程切换的事件:
    • 当前进程时间片到。
    • 有更高优先级的进程到达。
    • 当前进程主动阻塞。
    • 当前进程终止。

如何实现进程控制

alt text

  1. 操作系统创建一个进程:先初始化PCB,分配系统资源。
  2. 此时进程由创建态变为就绪态,插入到就绪队列中,等待CPU处理。
  3. 这个进程上CPU运行时,进程的状态由就绪态变为运行态。
    1. 如果这个进程直接运行完毕,那么会由运行态变为终止态。
    2. 如果这个进程运行过程中需要等待IO输入,那么会由运行态变为阻塞态,挂到阻塞队列中去,就绪队列中的另一个进程上CPU运行。
    3. 如果这个进程运行过程中被其他进程抢占,那么会由运行态变为就绪态,挂到就绪队列中去。