【进程控制】
进程控制的主要功能,是对系统中的所有进程实施有效的管理,其具有创建新进程、撤销已有进程、实现进程状态转换等功能
在操作系统中,通常将进程控制用的程序段称为原语,其在执行期间不允许中断,是一个不可分割的基本单位
进程控制主要有以下原语:
- 创建原语:为操作系统创建一个新进程
- 终止原语:终止操作系统中的一个进程
- 阻塞原语:将处于运行态的进程转为阻塞态
- 唤醒原语:将等待某事件的处于等待态的进程唤醒,转为就绪态
- 挂起原语:当出现引起进程挂起的事件时,将指定进程挂起
- 激活原语:当出现引起进程激活的事件时,将指定进程激活
【进程的创建】
引起进程创建的事件
为使程序间能并发运行,应先为它们分别创建进程,导致一个进程去创建另一个进程的典型事件有四类:
- 用户登录:分时系统中,用户在终端登录成功后,系统为该用户创建一个进程,并插入就绪队列中
- 作业调度:当作业调度程序按一定算法调度到某些作业时,会将它们装入内存,并创建进程,然后插入就绪队列中
- 提供服务:当运行中的用户程序提出功能请求时,系统会创建相应的服务进程
- 应用请求:用户进程自己创建新进程,以便新进程以同创建者进程并发运行的方式完成特定任务
进程的创建过程
在系统中,每当出现了创建新进程的请求后,OS 便调用进程创建原语(Creat),按下述步骤创建一个新进程:
- 申请空白 PCB:申请唯一的数字标识符,并从 PCB 集合中获取一个空白 PCB
- 为新进程分配所需资源:从 OS 或新进程的父进程获得各种物理、逻辑资源
- 初始化 PCB:初始化标识信息、处理机状态信息、处理机控制信息
- 将新进程插入就绪队列:若就绪队列能接纳新进程,则将新进程插入就绪队列
【进程的终止】
引起进程终止的事件
引起进程终止的事件可分为有以下三类:
- 正常结束:进程的任务已经完成,准备退出运行
- 异常结束:进程在运行时发生了某种异常事件,使得程序无法继续运行,常见的有:越界错误、保护错误、非法指令、运行超时、I/O 故障等
- 外界干预:进程应外界请求而终止运行,常见的干预有:父进程终止、父进程请求、OS 干预、操作员干预等
进程的终止过程
若系统中发生了要求终止进程的某事件,OS 将调用进程终止原语(Destroy) ,按下述步骤终止指定的进程:
- 读取终止进程的状态:根据被终止进程的标识符,从 PCB 集合中检索出该进程的 PCB,从而读出该进程的状态
- 执行态:若被终止进程处于执行态,立即终止该进程,并置调度标志为真,用于指示该进程被终止后应重新进行调度
- 有子孙进程:若被终止进程有子孙进程,应将其所有子孙进程全部终止,防止成为不可控进程
- 归还全部资源:将被终止进程所拥有的全部资源归还给父进程或 OS
- 移出 PCB:将终止进程 PCB 从所在队列中移出,等待其他程序搜集信息
【进程的阻塞与唤醒】
引起进程阻塞与唤醒的事件
引起进程阻塞或唤醒的事件有以下四种:
- 向系统请求共享资源失败:进程在向系统请求共享资源时,由于系统已无足够的资源分配,此时进程将转为阻塞状态,当其他进程释放出足够的资源后,请求进程才被唤醒
- 等待某种操作的完成:当进程启动某种操作后,若该进程必须在该操作完成后才能继续执行,则应先将该进程阻塞,等待操作完成后再将其唤醒
- 新数据尚未到达:对于相互合作的进程,若一进程需要另一进程提供的数据后才能对该数据进行处理,则当数据未到达时,该进程只能处于阻塞状态,直到数据到达,才会将其唤醒
- 等待新任务的到达:在某些系统中,往往会设置一些特定的系统进程,每当这种进程完成任务后就将自己阻塞起来,等待新任务的到来后,才被唤醒
进程的阻塞过程
正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语(block) 将自己阻塞,可见阻塞是进程自身的一种主动行为,其步骤如下:
- 停止执行:若该进程还处于执行状态,则应立即停止执行
- 改变 PCB 状态:将 PCB 中的现行状态由执行改为阻塞
- 插入阻塞队列:将改变现行状态后的 PCB 插入阻塞队列
- 转进程调度:将处理机分配给另一就绪进程
- 进行进程切换:保留被阻塞进程的处理机状态,按新进程的 PCB 中的处理机状态设置 CPU 环境
进程的唤醒过程
当被阻塞进程所期待的事件发生时,则有关进程调用唤醒原语(wakeup),将等待该事件的进程唤醒,其执行过程如下:
- 移出阻塞队列:将被阻塞的进程从等待该事件的阻塞队列中移出
- 改变 PCB 状态:将 PCB 中的现行状态由阻塞改为就绪
- 插入就绪队列:将该 PCB 插入就绪队列中
值得注意的是,block 原语与 wakeup 原语是一对作用相反的原语,在使用它们时,必须成对使用
即如果某进程中调用了阻塞原语,则必须在与之相合作、相关的进程中安排一条相应的唤醒原语,以便能唤醒被阻塞进程,否则,阻塞进程将会因不能被唤醒而永久处于阻塞状态
【进程的挂起与激活】
进程的挂起过程
当系统中出现引起进程挂起的事件时,OS 将利用挂起原语(suspend) 指定进程挂起,其步骤如下:
- 检查被挂起进程状态:若被挂起的进程处于活动就绪态,就改为静止就绪;若处于活动阻塞态,就改为静止阻塞
- 复制 PCB 到指定区域:为方便用户或父进程检查进程运行情况,将该进程的 PCB 复制到某指定的内存区域
- 重新调度:若被挂起的进程正在执行,则转向调度程序重新调度
需要注意的是,进程只能挂起自己或其子孙进程
进程的激活过程
当系统中出现引起进程激活的事件时,OS 将利用激活原语(active) 指定进程激活,其步骤如下:
- 调入内存:若挂起进程处于外存上,首先将其调入内存
- 检查被激活进程状态:若被激活的进程处于静止就绪态,就改为活动就绪;若处于静止阻塞态,就改为活动阻塞