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