第2章 进程管理
2.1 前趋图和程序执行
在早期未配置OS的系统和单道批处理系统中,程序的执行方式是顺序执行,即在内存中仅装入一道用户程序,由它独占系统中的所有资源,只有在一个用户程序执行完成后,才允许装入另一个程序并执行。可见,这种方式浪费资源、系统运行效率低等缺点。
2.1.1 前趋图
为了能更好地描述程序的顺序和并发执行情况,我们先介绍用于描述程序执行先后顺序的前趋图。
所谓前趋图(Precedence Graph),是指一个有向无循环图,可记为DAG(Directed Acyclic Graph),它用于描述进程之间执行的先后顺序。图中的每个结点可用来表示一个进程或程序段,乃至一条语句,结点间的有向边则表示两个结点之间存在的偏序(Partial Order)或前趋关系(Precedence Relation)。
进程(或程序)之间的前趋关系可用“→”来表示,如果进程Pi和Pj存在着前趋关系,可表示为(Pi,Pj)∈→,也可写成Pi→Pj,表示在Pj开始执行之前Pi 必须完成。此时称Pi是Pj的直接前趋,而称Pj是Pi的直接后继。
在前趋图中,把没有前趋的结点称为初始结点(Initial Node),把没有后继的结点称为终止结点(Final Node)。此外,每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或程序的执行时间。
应当注意,前趋图中是不允许有循环的,否则必然会产生不可能实现的前趋关系。如图2-1(b)所示的前趋关系中就存在着循环。它一方面要求在S3开始执行之前,S2必须完成,另一方面又要求在S2开始执行之前,S3必须完成。显然,这种关系是不可能实现的。
2.1.2 程序顺序执行
- 程序的顺序执行
- 通常,一个应用程序由若干个程序段组成,每一个程序段完成特定的功能,它们在执行时,都需要按照某种先后次序顺序执行,仅当前一程序段执行完后,才运行后一程序段。
- 例如,在进行计算时,应先运行输入程序,用于输入用户的程序和数据;然后运行计算程序,对所输入的数据进行计算;最后才是运行打印程序,打印计算结果。我们用结点(Node)代表各程序段的操作(在图2-1中用圆圈表示),其中I代表输入操作,C代表计算操作,P为打印操作,用箭头指示操作的先后次序。
- 这样,上述的三个程序段间就存在着这样的前趋关系:Ii→Ci→Pi,其执行的顺序可用前趋图2-2(a)描述。
2. 程序顺序执行时的特征
- 由上所述可以得知,在程序顺序执行时,具有这样三个特征:
- 1)顺序性:
指处理机严格地按照程序所规定的顺序执行,即每一操作必须在下一个操作开始之前结束; - 2) 封闭性:
指程序在封闭的环境下运行,即程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它,程序一旦开始执行,其执行结果不受外界因素影响; - 3)可再现性:
指只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“停停走走”地执行,都可获得相同的结果。程序顺序执行时的这种特性,为程序员检测和校正程序的错误带来了很大的方便。 - 4) 唯一对应性:
程序与执行过程一一对应。
2.1.3 程序并发执行
- 程序的并发执行
我们通过一个常见的例子来说明程序的顺序执行和并发执行。在图2-2中的输入程序、计算程序和打印程序三者之间,存在着Ii→Ci→Pi这样的前趋关系,以至对一个作业的输入、计算和打印三个程序段必须顺序执行。但若是对一批作业进行处理时,每道作业的输入、计算和打印程序段的执行情况如图所示。
对于具有下述四条语句的程序段:
S1: a :=x+2
S2: b :=y+4
S3: c :=a+b
S4: d :=c+b
可画出图2-4所示的前趋关系。可以看出:S3必须在a和b被赋值后方能执行;S4必须在S3之后执行;但S1和S2则可以并发执行,因为它们彼此互不依赖。
- 程序并发执行时的特征
在引入了程序间的并发执行功能后,虽然提高了系统的吞吐量和资源利用率,但由于它们共享系统资源,以及它们为完成同一项任务而相互合作,致使在这些并发执行的程序之间必将形成相互制约的关系,由此会给程序并发执行带来新的特征。
(1) 间断性(制约)。
(2) 失去封闭性。
(3) 不可再现性。
2.2 进 程 的 描 述
2.2.1 进程的定义和特征
- 进程的定义
在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性,并具有间断性,以及其运行结果不可再现性的特征。由此,决定了通常的程序是不能参与并发执行的,否则,程序的运行也就失去了意义。
为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了“进程”的概念。
- 进程的特征
进程和程序是两个截然不同的概念,除了进程具有程序所没有的PCB结构外,还具有下面一些特征:
2.2.2 进程的基本状态及转换
- 进程的三种基本状态
由于多个进程在并发执行时共享系统资源,致使它们在运行过程中呈现间断性的运行规律,所以进程在其生命周期内可能具有多种状态。一般而言,每一个进程至少应处于以下三种基本状态之一:
进程的三种基本状态,以及各状态之间的转换关系。
2.2.3 挂起操作和进程状态的转换
具有创建、终止和挂起状态的进程状态图
2.2.4 进程管理中的数据结构
4. 进程控制块的组织方式
在一个系统中,通常可拥有数十个、数百个乃至数千个PCB。为了能对它们加以有效的管理,应该用适当的方式将这些PCB组织起来。目前常用的组织方式有以下三种。
(1) 线性方式,即将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。图2-10示出了线性表的PCB组织方式。
(2) 链接方式,即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。对就绪队列而言,往往按进程的优先级将PCB从高到低进行排列,将优先级高的进程PCB排在队列的前面。同样,也可把处于阻塞状态进程的PCB根据其阻塞原因的不同,排成多个阻塞队列,如等待I/O操作完成的队列和等待分配内存的队列等。图2-11示出了一种链接队列的组织方式。
(3) 索引方式,即系统根据所有进程状态的不同,建立几张索引表,例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。图2-12示出了索引方式的PCB组织。
2.3 进 程 控 制
2.3.1 操作系统内核
2.3.2 进程的创建
- 进程的层次结构
在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,而把被创建的进程称为子进程。子进程可继续创建更多的孙进程,由此便形成了一个进程的层次结构。如在UNIX中,进程与其子孙进程共同组成一个进程家族(组)。
2.3.3 进程的终止
2.3.4 进程的阻塞与唤醒
2.3.5 进程的挂起与激活
习题
【例】进程从运行状态变为等待的原因可能是()
A 输入输出事件发生
B 时间片到
C 输入输出时间完成
D 某个进程被唤醒
【答案】A
【例】一个进程被唤醒,意味着()
A 该进程重新占有了CPU
B 进程状态变成就绪
C 它的优先权变为最大
D 其PCB移至据许队列的对首
【答案】B
【例】一个进程释放一种资源有可能导致一个或几个进程()
A 由就绪变运行
B 由运行变就绪
C 由阻塞变运行
D 由阻塞变就绪
【答案】D
【例】进程具有三种基本状态,阻塞态,运行态,就绪态,进程在执行过程中,其状态总是在不停地发生变化,下面关于进程状态变换的说法中正确的是()。
A 进程一旦形成,首先进入的是运行状态
B 三种进程状态是进程运行过程的基本状态,进程可能同时处于某几种状态中
C 一个进程必须经过进程的三个基本状态后才能结束
D 在分时系统中,一个正在运行进程的时间片到,该进程将进入就绪状态
【解答】D
【例】进程被创建后,最初处于()状态,然后经()选中后进入()状态。
【答案】就绪
进程调度程序
运行
【例】判断:当进程完成I/O后,进程的状态由等待变为运行。()
【答案】错误
【解析】当进程完成I/O后,进程的状态变为就绪,何时运行由进程调度程度决定