进程控制
进程控制是进程管理中最基本的功能,主要包括创建新进程。终止已完成的进程,将因发生异常情况而无法继续执行的进程置于阻塞状态,负责进程运行中的状态转换等功能。
通常将一些与硬件紧密相关的模块,各种常用设备的驱动程序以及运行频率较高的模块,都安排在紧靠硬件的软件层次中,将他们常驻内存,通常被称为OS内核。这种安排方式目的是为了:便于对这些软件进行保护,防止遭受其他应用程序的破坏;可以提高OS的运行效率。
与之相对应的是,为防止OS本身及关键数据遭受应用程序有意或无意的破坏,通常将处理机的执行状态分成系统态和用户态两种。
(1)系统态:又称为管态,也称为内核态。具有较高特权,能执行一切指令,访问所有寄存器和存储区,传统的OS都在系统态运行。
(2)用户态:又称为目态。具有较低特权的执行状态,仅能执行规定的指令,访问指定的寄存器和存储区。一般情况下,应用程序只能在用户态下运行,不能去执行OS指令及访问OS区域,这样可防止应用程序对OS的破坏。
大多OS内核包含了两大方面的功能:
(1)支撑功能。
- 中断处理。
- 时钟管理。
- 原语操作。
(2)资源管理功能。
- 进程管理。
- 存储器管理。
- 设备管理。
进程的层次结构: OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,被创建的进程称为子进程。**子进程可以继承父进程所拥有的资源,**当子进程被撤销时,应将其从父进程获得的资源归还给父进程。在撤销父进程时,也必须同时撤销其所有的子进程。
进程的创建
引起进程创建的事件:
- 用户登录。
- 作业调度。
- 提供服务。
- 应用请求。
进程创建过程:
- 申请空白PCB。
- 为新进程分配所需资源。
- 初始化进程控制块。(初始化的信息有标识信息、CPU状态信息、CPU控制信息)
- 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队
进程的终止
引起进程终止的事件:
- 正常结束,表示进程的任务已经完成,准备退出运行。
- 异常结束,指进程在运行时发生了某种异常事件,使程序无法继续执行。(常见异常事件有:(1)越界错。(2)保护错。(3)非法指令。(4)特权指令错。(5)运行超时。(6)等待超时。(7)算术运算错。(8)I/O故障。)
- 外界干预,指进程应外界请求而终止运行。(这些干预有:(1)操作员或操作系统干预。(2)父进程请求。(3)因父进程终止。 )
进程的终止过程:
- 根据标识符,从PCB检索出该进程PCB,读出该进程的状态。
- 若被终止进程处于执行态,应立即终止该进程的执行,置调度标志为真,表示该进程被终止后应重新进行调度。
- 将该进程的子孙进程也都给予终止,以防它们称为不可控进程。
- 将被终止进程的所有资源归还给其父进程或者操作系统。
- 将被终止进程(PCB)从所在队列中移出,等待其他程序来搜集信息。
进程的阻塞与唤醒
引起进程阻塞和唤醒的事件:
- 向系统请求共享资源失败。
- 等待某种操作完成。
- 新数据尚未到达。
- 等待新任务到达。
进程阻塞过程:正在执行的进程,当发现上述某事件时,由于无法继续执行,于是进程便通过调用阻塞原语block把自己阻塞。可见,阻塞是进程自身的一种主动行为。 进入block过程中,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为“阻塞”,并将PCB插入阻塞队列。
进程的唤醒过程:当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则由有关进程(比如用完并释放了该I/O设备的进程)调用唤醒原语wakeup( ),将等待该事件的进程唤醒。 wakeup执行过程:首先把被阻塞进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后将该PCB插入到就绪队列中。
block 原语和 wakeup 原语是一对作用刚好相反的原语。因此,如果在某进程中调用了阻塞原语,则必须在与之相合作的另一进程中或其他相关的进程中安排唤醒原语,以能唤醒阻塞进程;否则,被阻塞进程将会因不能被唤醒而长久地处于阻塞状态,从而再无机会继续运行。
进程的挂起与激活
进程的挂起: 当出现引起进程挂起事件时,OS将用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。suspend执行过程:先检查被挂起进程状态,如果为活动就绪,将其改为静止就绪;若为活动阻塞,则改为静止阻塞。为方便用户或父进程考查该进程运行情况,把该进程的PCB复制到指定的内存区域;最后,若被挂起的进程正在执行,则转向调度程序重新调度。
进程的激活过程: 当发生激活进程的事件时,OS将用激活原语active将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,将其改为活动就绪;若为静止阻塞,改为活动阻塞。