进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
进程的创建
允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,必须同时撤销其所有的子进程。在操作系统中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。操作系统创建一个新进程的过程如下(创建原语):
为新进程分配一个唯一的进程标识号,并申请一个空白的 PCB (PCB是有限的)。若 PCB 申请失败,则创建失败。
为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间(在 PCB 中体现)。注意,若资源不足(如内存空间),则并不是创建失败,而是处于阻塞态,等待内存资源。
初始化 PCB ,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。
进程的终止
引起进程终止的事件主要有:
正常结束,表示进程的任务已完成并准备退出运行。
异常结束,表示进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算错、I/O故障等。
外界干预,指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止。
操作系统终止进程的过程如下(撤销原语):
根据被终止进程的标识符,检索 PCB ,从中读出该进程的状态。
若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
若该进程还有子孙进程,则应将其所有子孙进程终止。
将该进程所拥有的全部资源,或归还给其父进程,或归还给操作系统。
将该 PCB 从所在队列(链表)中删除。
进程的阻塞和唤醒
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作可做等,由系统自动执行阻塞原语(Block),使自己由运行态变为阻塞态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞态。阻塞原语的执行过程如下:
找到将要被阻塞进程的标识号对应的 PCB 。
若该进程为运行态,则保护其现场,将其状态转为阻塞态,停止运行。
把该 PCB 插入相应事件的等待队列,将处理机资源调度给其他就绪进程。
当被阻塞进程所期待的事件出现时,如它所启动的 I/O 操作已完成或其所期待的数据已到达,由有关进程(比如,释放该 I/O 设备的进程,或提供数据的进程)调用唤醒原语( Wakeup),将等待该事件的进程唤醒。唤醒原语的执行过程如下:
在该事件的等待队列中找到相应进程的 PCB 。
将其从等待队列中移出,并置其状态为就绪态。
把该 PCB 插入就绪队列,等待调度程序调度。
需要注意的是, Block 原语和 Wakeup 原语是一对作用刚好相反的原语,必须成对使用。 Block 原语是由被阻塞进程自我调用实现的,而 Wakeup 原语则是由一个与被唤醒进程合作或被其他相关的进程调用实现的。
进程切换
对于通常的进程而言,其创建、撤销及要求由系统设备完成的 I/O 操作,都是利用系统调用而进入内核,再由内核中的相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。进程切换是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。进程切换的过程如下:
保存处理机上下文,包括程序计数器和其他寄存器。
更新 PCB 信息。
把进程的 PCB 移入相应的队列,如就绪、在某事件阻塞等队列。
选择另一个进程执行,并更新其 PCB 。
更新内存管理的数据结构。
恢复处理机上下文。
注意,进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的 CPU 现场,而无须改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。
注意:“调度”和“切换”的区别。调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程切换。
Last updated
Was this helpful?