进程的控制
进程控制块(PCB)
进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。其作用
是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的, 它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息。
进程控制块(PCB)是系统为了管理进程
设置的一个专门的数据结构。系统用它来记录进程的外部特征,描述进程的运动变化过程。同时,系统可以利用PCB来控制和管理进程,所以说,PCB(进程控制块)是系统感知进程存在的唯一标志。
PCB通常记载进程之相关信息,包括:
- 程序计数器:接着要运行的指令地址。
- 进程状态:可以是new、ready、running、waiting或 blocked等。
- CPU暂存器:如累加器、索引暂存器(Index register)、堆栈指针以及一般用途暂存器、状况代码等,主要
- 用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类因电脑架构有所差异。
- CPU排班法:优先级、排班队列等指针以及其他参数。
- 存储器管理:如标签页表等。
- 会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。
- 输入输出状态:配置进程使用I/O设备,如磁带机。
进程控制块PCB的组织方式:
- 线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况。
- 索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。
- 链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。
进程的创建
在系统中每当出现了创建新进程的请求后,OS便调用进程创建原语 Creat按下述步骤创建一个新进程:
-
申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
-
为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、IO设备和CPU时间等。
这些资源或从操作系统或仅从其父进程获得。新进程对这些资源的需求详情一般也要提前告知操作系统或其父进程。
例如:为新进程的程序和数据以及用户栈分配必要的内存空间时,操作系统必须知道新进程所需内存的大小:
? ①对于批处理作业,其大小可在用户提出创建进程要求时提供;
? ②若是为应用进程创建子进程,也应是在该进程提出创建进程的请求中给出所需内存的大小;
? ③对于交互型作业,用户可以不给出内存要求而由系统分配一定的空间;如果新进程要共享某个已在内存的地址空间(即已装入内存的共享段),则必须建立相应的链接
-
初始化进程控制块(PCB)。
PCB的初始化包括:
? ①
初始化标识信息
,将系统分配的标识符和父进程标识符填入新PCB中;? ②
初始化处理机状态信息
,使程序计数器指向程序的入口地址,使栈指针指向栈顶;? ③
初始化处理机控制信息
,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式方式提出高优先级要求。 -
如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
进程的终止
引起进程终止的事件
-
正常结束:表示进程的任务已经完成,准备退出运行。在任何系统中,都应有个用于表示进程已经运行完成的指示。
-
异常结束:是指进程在运行时发生了某种异常事件,使程序无法继续运行。
常见的异常事件有:
? ①越界错,这是指程序所访问的存储区,已越出该进程的区域;
? ②保护错,指进程试图去访问一个不允许访问的资源或文件,或者以不适当的方式进行访问,例如,进程试图去写一个只读文件;
? ③非法指令,指程序试图去执行一条不存在的指令。出现该错误的原因可能是程序错误地转移到数据区,把数据当成了指令:
? ④特权指令错,指用户进程试图去执行一条只允许OS执行的指令;
? ⑤运行超时,指进程的执行时间超过了指定的最大值;
? ⑥等待超时,指进程等待某事件的时间超过了规定的最大值;
? ⑦算术运算错,指进程试图去执行一个被禁止的运算,例如,被0除:⑧IO故障,这是指在IO过程中出错
-
外界干预:是指进程应外界的请求而终止运行。
这些干预有:
①操作员或操作系统干预,指如果系统中发生了某事件,例如,发生了系统死锁,由操作员或操作系统采取终止某些进程的方式使系统从死锁状态中解救出来;
②父进程请求,指当子进程已完成父进程所要求的任务时,父进程可以提出请求结束该子进程;
③因父进程终止,指当父进程终止时,它的所有子进程也都应当结束,因此,OS在终止父进程的同时,也将它的所有子孙进程终止。
进程终止的过程
如果系统中发生了要求终止进程的某事件,OS便调用进程终止原语,按下述过程去终止指定的进程:
- 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;
- 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度;
- 若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程;
- 将被终止进程所拥有的全部资源或者归还给其父进程,或者归还给系统
- 将被终止进程(PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。
进程的阻塞和唤醒
引起进程阻塞和唤醒的事件
- 向系统请求共享资源失败:进程在向系统请求共享资源时,由于系统已无足够的资源分配给它,此时进程因不能继续运行而转变为阻塞状态。例如,一进程请求使用打印机,由于系统已将打印机分配给其它进程,已无可以再可分配的打印机,这时请求者进程只能被阻塞,仅在其它进程释放出打印机时,请求进程才被唤醒。
- 等待某种操作的完成:当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则应先将该进程阻塞起来,以等待操作完成。例如,进程启动了某IO设备,如果只有在IO设备完成了指定的IO操作任务后进程才能继续执行,则该进程在启动了IO设备后便应自动进入阻塞状态去等待。在IO操作完成后,再由中断处理程序将该进程唤醒。
- 新数据尚未到达:对于相互合作的进程,如果一个进程需要先获得另一进程提供的数据后才能对该数据进行处理,只要其所需数据尚未到达,进程便只有阻塞。例如,有两个进程,进程A用于输入数据,进程B对输入数据进行加工。假如A尚未将数据输入完毕,则进程B将因没有所需处理的数据而阻塞;一旦进程A把数据输入完毕,便可去唤醒进程B
- 等待新任务的到达:在某些系统中,特别是在网络环境下的Os,往往设置一些特定的系统进程,每当这种进程完成任务后便把自己阻塞起来,等待新任务的到来。例如在网络环境中的发送进程,其主要任务是发送数据包,若已有的数据包已全部发送完成,而又无新的数据包发送,这时发送进程将把自己阻塞起来;仅当有新的数据包到达时,才将发送进程唤醒。
进程阻塞的过程
? 正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语 block
将自己阻塞。可见,阻塞是进程自身的一种主动行为。
? 进入 block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞
,并将PCB插入阻塞队列
。
? 如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列。
? 最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态,按新进程的PCB中的处理机状态设置CPU的环境。
进程唤醒的过程
? 当被阻塞进程所期待的事件发生时,比如它所启动的IO操作已完成,或其所期待的数据已经到达,则由有关进程(比如提供数据的进程)调用唤醒原语 wakeup
,将等待该事件的进程唤醒。
? wakeup执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪
,然后再将该PCB插入到就绪队列
中。
应当指出,block原语和 wakeup原语是一对作用刚好相反的原语。在使用它们时,必须成对使用,即如果在某进程中调用了阻塞原语,则必须在与之相合作的、或其它相关的进程中安排一条相应的唤醒原语,以便能唤醒被阻塞进程;否则,阻塞进程将会因不能被唤醒而永久地处于阻塞状态,再无机会继续运行
线程的挂起和激活
进程的挂起
当系统中出现了引起进程挂起的事件时,OS将利用
挂起原语 suspend
将指定进程或处于阻塞状态的进程挂起。
? suspend的执行过程是:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞;为了方便用户或父进程考査该进程的运行情况,而把该进程的PCB复制到某指定的内存区域最后,若被挂起的进程正在执行,则转向调度程序重新调度。
进程的激活过程
当系统中发生激活进程的事件时,OS将利用
激活原语 active
,将指定进程激活。激活原语先将进程从外存调入内存,检査该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞。
? 假如采用的是抢占调度策略,则每当有静止就绪进程被激活而插入就绪队列时,便应检査是否要进行重新调度,即由调度程序将被激活的进程与当前进程两者的优先级进行比较,如果被激活进程的优先级低,就不必重新调度;否则,立即剥夺当前进程的运行,把处理机分配给刚刚被激活的进程