OS(三):进程管理之 进程的控制
控制进程的程序段,进程控制一般是由OS的内核中的原语来实现的。原语是不可再分的原子操作(Action Operation),执行过程中不会被打断。
1、原语
2.1、原语概念
原语的概念:由若干条指令组成,完成特定的功能,是一种原子操作(Action Operation)。
2.2、原语特点
原语的特点:原子操作,一个操作中的所有动作要么全做,要么全不做,执行过程不会被中断;在管态/系统态/内核态下执行,常驻内存;是内核三大支撑功能(中断处理/时钟管理/原语操作)之一。
2.3、原语作用
实现进程的通信和控制。
2.4、常见原语
2.4.1、进程控制原语
创建原语:create()
阻塞原语:block()
唤醒原语:wakeup()
撤销原语:destroy()
2.4.2、常见其他原语
挂起原语:suspend()
激活原语:active()
2、进程的创建
2.1、进程间的关系
进程中有父进程、子进程的概念。如在进程A中创建了进程B,成A是B的父进程,B是A的子进程。
子进程可以继承父进程所拥有的资源,当子进程被撤销时,应将其从父进程哪里获得的资源归还给父进程。
撤销父进程时,必须同时撤销器所有的子进程。
为标识进程间的关系,在PCB中设置了进程关系表项,标明自己的父进程及所有的子进程。
2.2、创建进程的事件
2.2.1、作业调度
作业调度程序按一定的算法调度到某作业时,该作业装入内存,为它分配必要的资源,并立即为它创建进程,再插入就绪队列中。
2.2.2、提供服务
运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务。
2.2.3、应用请求
应用进程创建一个新进程,使新进程以并发运行方式完成特定任务。
2.3、进程的创建
进程的创建需要调用进程创建原语Create()。
2.3.1、申请空白PCB
为新进程申请获得惟一数字标识符,并从PCB集合中索取一个空白PCB。
2.3.2、为新进程分配存储空间
2.3.3、初始化PCB
3.1、初始化标识信息
系统分配的标识符和父进程的标识符填入新PCB中。
3.2、初始化处理机状态
使程序计数器指向程序的入口地址,使栈指针指向栈顶。
3.3、初始化处理机控制信息
将进程的状态设置为就绪状态或静止就绪状态。
2.3.4、将新进程插入就绪队列
3、进程的终止
3.1、进程终止原因
3.1.1、正常结束
自然结束:运行到Holt指令(最后一条指令)时,将产生一个中断,去通知OS本进程已经完成
3.1.2、异常结束
由于出现某些错误和故障而迫使进程终止,越界错误,保护错误,非法指令,特权指令错误,运行超时,等待超时,算术运算错误,I/O故障。
3.1.3、外界干预
进程应外界的请求而终止运行;被操作员或操作系统终结;被其他有终止权的进程(父进程)所终结。
3.2、进程终止过程
系统中发生终止进程事件,OS调用进程终止原语,终止指定进程。
2.1、根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态。
2.2、若终止进程正处于执行状态,立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
2.3、若要终止的进程有子孙进程,将所有子孙进程终止。
2.4、将被终止进程拥有的全部资源,归还给父进程或系 统;
2.5、将被终止进程(PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息。
4、进程的阻塞与唤醒
4.1、引起进程阻塞和唤醒的事件
请求系统服务:等待OS分配打印机服务
启动某种操作:等待I/O操作完成
新数据尚未到达:B进程等待A进程的数据输入
无新工作可做:进程空闲,等待新任务到来
4.2、进程阻塞过程
调用阻塞原语block()把自己阻塞:进程的阻塞是一种主动行为
1、立即停止执行
2、进程状态由执行状态(Running)改为阻塞状态(Blocked)
3、将PCB插入阻塞队列
4、因不同事件进行阻塞的进程可能会形成多个阻塞队列,直到调度程序进行重新调度它们
4.3、进程唤醒过程
有关进程调用唤醒原语wakeup( ), 将等待该事件的进程唤醒;
1、把被阻塞的进程从等待该事件的阻塞队列中移出;
2、将其PCB中的现行状态改为就绪,再将该PCB插入到就绪队列中;
3、被唤醒的进程进入就绪状态(Ready),而非执行状态(Running);
4、被阻塞进程必须由其它进程唤醒,否则,将一直处于阻塞状态,从而再无机会继续运行。
5、进程的挂起与激活
5.1、进程的挂起
OS利用挂起原语 suspend()将指定进程或处于阻塞状态的进程挂起。执行过程如下:
检查被挂起进程的状态, 若处于活动就绪状态, 便将其改为静止就绪;
对于活动阻塞状态的进程,则将之改为静止阻塞;
若被挂起的进程正在执行,则转向调度程序重新调度;
把该进程的PCB复制到某指定的内存区域,方便用户或父进程考查该进程的运行情况。
5.2、进程的激活
OS利用激活原语 active() 将指定进程激活。
激活原因:父进程或用户进程请求激活
激活过程:激活原语先将进程从外存调入内存;检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞。
激活后需要根据处理机调度策略和进程优先级等条件决定该进程是否执行。