进程控制

进程控制是进程管理中最基本的功能。一般由OS的内核中的原语来实现。
主要包括:
1)创建新进程
2)终止已完成的进程
3)将因发生异常情况而无法继续运行的进程置于阻塞状态
4)负责进程运行中的状态转换

进程创建

1. 进程的层次结构
OS中,允许一个进程(父进程)创建另一个进程(子进程),由此形成了一个进程的层次结构(进程树)。

1)子进程可以继承父进程所拥有的资源,例如继承父进程打开的文件、父进程分配到的缓冲区等。
2)当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。
3)此外,在撤销父进程时,也必须同时撤销其所有的子进程。
4)为了标识进程的家族信息 — PCB中设置了家族关系表项 — 标明父进程和所有的子进程。进程不能拒绝子进程的继承权。

值得注意的是,Windows中不存在任何进程层次结构的概念,所有进程都具有相同的地位。
如果一个进程创建另外的进程时,创建进程获得了一个句柄,其作用是可用来控制被创建的进程。但是,这个句柄是可传递的,获得了句柄的进程就拥有控制其他进程的权利。
进程之间不再是层次关系,而是获得句柄与否、控制与被控制的简单关系。

2. 进程图
描述一个进程的家族关系 — 有向树 — 父进程指向子进程

3. 引起创建进程的事件
四类典型事件:

1)用户登录。在分时系统中,用户在中断键入登录命令后,若登录成功,系统将为该用户创建一个进程,并把它插入到就绪队列中。

2)作业调度。在多道批处理系统中,当作业调度程序按一定算法调度到某个(些)作业时,将它们装入内存,为它们创建进程,并把它们插入就绪队列。

3)提供服务。当运行中的用户程序提出某种要求后,系统将专门创建一个进程来提供用户所需要的服务。
要求进行文件打印 — 操作系统创建一个打印进程 — 不仅可使打印进程与该用户进程并发执行,还便于计算为完成打印任务所花费的时间。

4)应用请求。上述三种情况都是系统内核为用户创建一个新进程;而这类事件则是用户进程自己创建新进程,以便使新进程以同创建者进程并发运行的方式完成特定任务。
某用户程序需要不断地先从键盘终端读入数据,继而再对输入数据进行相应的处理,然后,再将处理结果以表格形式在屏幕上显示。为了使这几个操作并发运行,以加速任务完成,可分别创建键盘输入进程、表格输出进程。

4. 进程的创建
系统中出现创建新进程的请求 — OS便调用进程创建原语Creat按以下步骤创建新进程:

1)申请空白PCB,为新进程申请获得唯一的数字标识符(内部标识符),并从PCB集合中索取一个空白PCB

2)为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等 ---- 从操作系统或父进程获得。

新进程对这些资源的需求详情一般也要提前告知操作系统或其父进程。
例如,为新进程的程序和数据以及用户栈分配必要的内存空间时,操作系统必须知道新进程所需内存的大小:

批处理作业其大小可在用户提出创建进程要求时提供
为应用进程创建子进程在该进程提出创建进程的请求中给出所需内存的大小
交互型作业用户可不给出内存要求而由系统分配一定的空间;如果新进程要共享某个已在内存的地址空间(即已装入内存的共享段),则必须建立相应链接

3)初始化进程控制快(PCB)。
包括:
1.初始化标识信息,将系统分配的标识符和父进程标识符填入新的PCB中
2.初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
3.初始化处理机控制信息,将进程状态设置为就绪状态或静止就绪状态,通常设置为最低优先级,除非用户以显式方式提出高优先级要求。

4)如果就绪队列能够接纳新进程,便将新进程插入就绪队列。

进程的终止

引起终止的事件
1)正常结束 — 任何系统中都应有一个用于表示进程已经运行完成的指示
2)异常结束 — 发生了某种异常事件

  1. 越界错 — 程序所访问的存储区,已越出该进程的区域
  2. 保护错 — 程序试图去访问一个不允许访问的资源或文件 或 以不适当的方式进行访问
  3. 非法指令 — 程序试图去执行一条不存在的指令。出现该错误的原因可能是程序错误地转移到数据区,把数据当成了指令
  4. 特权指令错 — 用户程序试图去执行一条只允许OS执行的指令
  5. 运行超时 — 进程执行时间超过了指定的最大值
  6. 等待超时 — 进程等待某事件的时间超过了规定的最大值
  7. 算术运算错 — 进程试图去执行一个被禁止的运算,如被0除
  8. I/O故障

3)外界干预 — 应外界请求而终止运行
9. 操作员或OS干预 — 系统中发生了某事件,例如系统死锁,由操作员和OS采取终止某些进程的方式使系统从死锁状态中解救出来
10. 父进程请求 — 子进程完成父进程所要求的任务,父进程可提出请求结束子进程
11. 因父进程终止 — 所有子进程应当结束

终止过程 — 调用终止原语
12. 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态
13.若被终止进程正处于执行状态,立即终止进程运行,并置调度标志为真,用于指示该进程被终止后应重新进行调度
13. 若由子孙进程,应将其子孙进程都予以终止
14. 将被终止进程拥有的全部资源归还给系统或父进程
15. 将被终止进程(PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息。

进程的阻塞和唤醒

引起进程的阻塞和唤醒的事件
1)向系统请求共享资源失败。
系统无足够资源分配给它,进程不能继续运行而转变为阻塞状态。

2)等待某种操作的完成。
当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则应先将该进程阻塞起来,以待操作完成。

3)新数据尚未到达。
对于相互合作的进程,如果一个进程需要先获得另一个进程提供的数据才能对其进行处理,只要需要的数据尚未到达,进程便只有阻塞。

4)等待新任务的到达。
某些系统中,特别是在网络环境下的OS,往往设置一些特定的系统进程,每当这种进程完成任务后便把自己阻塞起来,等待新任务的到来。

进程阻塞过程
正在执行的进程,发生了上述事件
1)进程便通过调用阻塞原语block将自己阻塞。可见阻塞是进程自身的一种主动行为。

2)进入block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列
(如果系统中设置了不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列)

3)转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换(保留被阻塞进程的处理机状态在PCB中,再按新程序的PCB中的处理机状态设置CPU环境)。

进程唤醒过程
当被阻塞进程所期待的事件发生时
由有关进程(比如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒

wakeup执行的过程是:
1)首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中

注意,block原语和wakeup原语是一对作用刚好相反的原语,必须成对使用,即如果在某进程中调用了阻塞原语,则必须在与之相合作的、或其他相关的进程中安排一条相应的唤醒原语,以便能唤醒该被阻塞进程;否则,阻塞进程将会因不能被唤醒而永久地处于阻塞状态,再无机会继续运行

进程的挂起与激活

进程的挂起
当系统中出现了引起进程挂起的事件时,OS将利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。
suspend的执行过程是:
首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞;
为了方便用户或父进程考查该进程的运行情况,而把该进程的PCB复制到某指定的内存区域;
最后,若被挂起的进程正在执行,则转向调度程序重新调度。

进程的唤醒
当系统中发生激活进程的事件时,OS将利用激活原语active,将指定进程激活。
active的执行过程是:
激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞。
假如采用的是抢占调度策略,则每当有静止就绪进程被激活而插入就绪队列时,便应检查是否要进行重新调度,即由调度程序将被激活的进程与当前进程二者的优先级进行对比 ,如果被激活的进程的优先级低,就不必重新调度;若它高,则重新调度,将处理机分配给刚被激活的进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值