进程管理(进程控制)

进程控制就是系统使用一些具有特定功能的程序段来创建、撤销进程以及完成进程各状态间的转换,从而达到多进程高效率并发执行和协调,实现资源共享的目的。

一般地,把系统态下执行的某些具有特定功能的程序段称为原语(primitive)。原语可分为两类:一类是及其指令级的,其特点是执行期间不允许中断,正如在物理学中的原子一样,在操作系统中,它是一个不可分割的基本单位;另一类是功能级的,其特点是作为原语的程序段不允许并发执行。这两类原语都在系统态下执行,且都是为了完成某个系统管理所需要的功能和被高层软件所调用。

系统在创建、撤销一个进程以及要改变进程状态时都要调用相应的程序段来完成这些功能,为了达到控制进程的目的,操作系统将这些程序段做成原语,即不允许这些程序段并发执行,这样也就防止了这些程序段并发执行导致结果失去封闭性和可再现性。但是也可以允许这些程序段并发执行,那么就需要通过同步和互斥控制方法使其在并发执行过程中也能完成进程控制任务。但是这样会大大增加系统的开销和复杂度,所以并没有这么做。

操作系统中,通常把进程控制用程序段做成原语。用于进程控制的原语有创建原语,撤消原语,阻塞原语,唤醒原语,挂起原语,激活原语。

 

  • 进程创建与撤销

1.进程创建。创建进程有两种方式。

第一种是由系统程序模块统一创建。这种方式创建的进程之间的关系是平等的,他们之间一般不存在资源继承关系。

第二种是由父进程创建。这种方式创建的进程之间存在隶属关系,且互相构成树型结构的家族关系。属于某个家族的一个进程可以继承其父进程拥有的资源。

无论是哪种方式创建的进程,在系统生成时,都必须由操作系统创建一部分承担系统资源分配和管理工作的系统进程。

无论是那种方式创建的进程,都必须调用创建原语来实现。创建原语扫描内存中存放PCB的链表,并申请新PCB空间,在申请到新PCB后,填入调用者提供的有关参数,最后形成代表新进程的PCB结构。

2.进程撤销。

以下三种情况会导致进程被撤销。

(1)该进程已完成所要求的功能而正常终止。

(2)由于某种错误导致非正常终止。

(3)祖先进程要求撤销某个子进程。

无论哪一种情况导致进程被撤销,进程都必须释放它所占用的各种资源和PCB结构本身。当然,一个进程所占有的某些资源在使用结束时可能早已释放。另外,当一个祖先进程撤销某个子进程时,还需审查该子进程是否还有自己的子孙金成,若有的话,还需撤销其子孙进程的PCB结构和释放它们所战友的资源。

撤销原语首先检查PCB进程链或进程家族,寻找所要撤销的进程是否存在。如果找到了所要撤销的进程的PCB结构,则撤销原语释放该进程所占有的资源之后,把对应的PCB结构从进程链或进程家族中摘下并返回给PCB空队列。如果被撤销的进程有自己的子进程,则撤销原语先撤销其子进程的PCB结构,并释放子进程所占用的资源之后,再撤销当前进程的PCB结构和释放其资源。

  • 进程的阻塞与唤醒

阻塞原语在一个进程等待某一事件(例如:键盘输入数据、写盘、其他进程发来的数据等)发生,但发生事件尚不具备时,被该进程自己调用用来阻塞自己。阻塞原语在阻塞一个进程时,由于该进程正处于执行状态,故应先中断处理机和保存该进程的CPU现场,然后将被阻塞进程置“阻塞”状态后插入等待队列中,再转进程调度程序选择新的就绪进程投入运行。

在等待队列中的进程所等待的事件发生时,等待该事件的所有进程都将被唤醒。显然,一个处于阻塞状态的进程不可能自己唤醒自己。唤醒进程有两种方法:一种是由系统进程唤醒;另一种是由事件发生进程唤醒。当由系统进程唤醒等待进程时,系统进程统一控制事件的发生并将“事件发生”这一消息通知等待进程。从而使得该进程因等待事件已发生而进入就绪队列。等待进程也可由事件发生进程唤醒。由事件发生进程唤醒时,事件发生进程和被唤醒进程之间是合作关系。因此,唤醒原语既可被系统进程调用,也可被事件发生进程调用。称调用唤醒原语的进程为唤醒进程。唤醒原语首先将被唤醒进程从相应的等待队列中摘下,将被唤醒进程置为就绪状态之后,送入就绪队列。在把被唤醒进程送入就绪队列之后,唤醒原语既可以返回原调用程序,也可以转向进程调度,以便让调度程序有机会选择一个合适的进程执行。

  • 进程的挂起与激活

当出现了引起进程挂起的事件时,比如,用户进程请求将自己挂起,或父进程请求将自己的某个子进程挂起,系统将利用挂起原语将指定进程或处于阻塞状态的进程挂起。挂起原语检查被挂起进程的状态,若处于活动就绪状态,就将其改为静止就绪;对于活动阻塞状态的进程,改为静止阻塞;若被挂起的进程正在执行,则改为静止就绪,并装箱调度程序重新调度。

当发生激活进程的事件时,例如,如今成或用户进程请求激活指定进程,若该进程主流在外存而内存中已有足够的空间时,可将在外存上处于静止就绪状态的该进程换入内存。这时,系统将利用激活原语将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞。

猜你喜欢

转载自blog.csdn.net/Dream_Ryoma/article/details/81607133