目录
2.3 进程控制
2.3.1 操作系统内核
2.3.2 进程的创建
2.3.3 进程的终止
2.3.4 进程的阻塞与唤醒
2.3.5 进程的挂起与激活
进程控制是用于创建一个新进程,终止一个已完成的进程,或去终止一个因出现某事件而使其无法运行下去的进程,还负责进程运行中的状态转换。
进程控制一般是由 OS 的内核中的原语(Primitive)来实现的。
OS 内核——常驻内存。
OS 内核包含两大功能:
1. 进程的层次结构
2. 进程图(process graph)
进程图是用于描述一个进程的家族关系的有向树。
3. 引起进程创建的事件
导致一个进程去创建另一个进程的典型事件,可有以下四类:
4. 进程的创建过程
调用进程创建原语 Creat() 按下述步骤创建一个新进程:
1)申请空白 PCB
2)为新进程分配资源(挂到 PCB 上)
3)初始化进程控制块 PCB,包括:
4)将新进程插入就绪队列
1. 引起进程终止的事件
1)正常结束:批处理中用 Holt 指令,分时中用 Logs off 指令。
2)异常结束:
本进程运行中出现了异常事件。
OS 是无法预先判断一个作业需要运行多长时间的。
3)外界干预
并非指本进程运行中出现了异常事件,而是指进程为响应外界请求而终止运行。
2. 进程的终止过程
1)根据被终止进程的标识符 ID,从 PCB 集合中检索出该进程的 PCB,从中读出该进程的状态。
2)若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为 true,用于指示该进程被终止后应重新进行调度。
3)若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防它们成为不可控的进程。
级联地终止,防止孤儿进程的出现。
4)将被终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统。
5)将被终止进程(它的PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。
1. 引起进程阻塞的事件
1)请求系统服务:进程提出 I/O 服务请求且不能被立即满足时,转变为阻塞状态来等待。
2)启动某种操作:当进程启动某种操作后,在该操作完成之后才能继续执行
3)新数据尚未到达:对于相互合作的进程而言。
4)无新工作可做(如发送进程)
为了防止 CPU 空转,进程自己把自己阻塞,有新工作时再唤醒。
2. 进程的阻塞过程
1)正在执行的进程,当发现上述某事件时,由于无法继续执行,于是进程便通过调用阻塞原语 block( ) 把自己阻塞。
2)把进程控制块中的现行状态由执行改为阻塞,并将 PCB 插入阻塞队列。
3)转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换。
3. 进程的阻塞与唤醒
当被阻塞进程所期待的事件出现时,则由有关进程(如:用完并释放了该 I/O 设备的进程)调用唤醒原语 wakeup(),将等待该事件的进程唤醒。
4. 进程的唤醒过程
1)首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其 PCB 中的现行状态由阻塞改为就绪。
2)然后再将该 PCB 插入到就绪队列中。
1. 进程的挂起过程
当出现了引起进程挂起的事件时,系统将利用挂起原语 suspend() 将指定进程挂起。
suspend() 的执行过程是:
首先检查被挂起进程的现行状态
2. 进程的激活过程
当发生了激活进程的事件时,则可将在外存上处于静止就绪状态的进程换入内存,系统再利用激活原语 active() 将指定进程激活。
active() 的执行过程是:
首先将进程从外存调入内存,检查该进程的现行状态