2.进程的描述与控制

进程的描述与控制

1.前驱图与程序执行

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),用于表示该结点所含有的程序量或程序的执行时间

所示的前趋图a中,存在着如下前趋关系:
P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9

或表示为:
P={P1, P2, P3, P4, P5, P6, P7, P8, P9} ={(P1, P2), (P1, P3), (P1, P4), (P2, P5), (P3, P5), (P4, P6), (P4, P7), (P5, P8), (P6, P8), (P7, P9), (P8, P9)}

应当注意,前趋图中是不允许有循环的,否则必然会产生不可能实现的前趋关系。如图(b)所示的前趋关系中就存在着循环。它一方面要求在S3开始执行之前,S2必须完成,另一方面又要求在S2开始执行之前,S3必须完成。显然,S2→S3,S3→S2这种关系是不可能实现的。

1.2程序的顺序执行

通常,一个应用程序由若干个程序段组成,每一个程序段完成特定的功能,它们在执行时,都需要按照某种先后次序顺序执行,仅当前一程序段执行完后,才运行后一程序段。例如,在进行计算时,应先运行输入程序,用于输入用户的程序和数据;然后运行计算程序,对所输入的数据进行计算;最后才是运行打印程序,打印计算结果。我们用结点(Node)代表各程序段的操作(在图2-1中用圆圈表示),其中I代表输入操作,C代表计算操作,P为打印操作,用箭头指示操作的先后次序。

这样,上述的三个程序段间就存在着这样的前趋关系:Ii→Ci→Pi,其执行的顺序可用前趋图(a)描述。

即使是一个程序段,也可能存在着执行顺序问题,下面示出了一个包含了三条语句的程序段:

S1: a :=x+y;

S2: b :=a-5;

S3: c :=b+1;
其中,语句S2必须在语句S1后(即a被赋值)才能执行,语句S3也只能在b被赋值后才能执
行,因此,三条语句存在着这样的前趋关系:S1→S2→S3,应按前趋图(b)所示的顺序执行。

程序顺序执行时的特征:
1.顺序性
2.封闭性
3.可再现性

1.3程序的并发执行

我们通过一个常见的例子来说明程序的顺序执行和并发执行。在图中的输入程序、计算程序和打印程序三者之间,存在着Ii→Ci→Pi这样的前趋关系,以至对一个作业的输入、计算和打印三个程序段必须顺序执行

但若是对一批作业进行处理时,每道作业的输入、计算和打印程序段的执行情况如下图所示。可以看出,存在前趋关系Ii→Ci,Ii→Ii+1,Ci→Pi,Ci→Ci+1,Pi→Pi+1,而Ii+1和Ci及Pi-1是重叠的,即在Pi-1和Ci以及Ii+1之间,不存在前趋关系,可以并发执行。

对于具有下述四条语句的程序段:

S1: a :=x+2

S2: b :=y+4

S3: c :=a+b

S4: d :=c+b
可画出下图所示的前趋关系。可以看出:S3必须在a和b被赋值后方能执行;
S4必须在S3之后执行;但S1和S2则可以并发执行,因为它们彼此互不依赖。

程序并发执行的特征:
1.间断性:执行->暂停->执行
2.失去封闭性:失去独占性
3.不可再现性:结果不唯一

程序顺序执行与程序并发执行的对比:

    程序顺序执行:
    1) 顺序性(保证前驱、后继关系)
    2) 封闭性(程序不间断执行,占有本机所有资源,资源状态只有本程序可改变,执行结果不受外界影响)
    3) 可再现性(只要条件相同,不管何时、何地执行,结果均相同)
    
    程序并发执行(提高系统运行效率)1) 间断性(并发程序之间相互制约,例如互为输入输出,程序具有“执行――暂停执行――再次执行”的活动规律)
    2) 失去封闭性(系统资源由多个程序共享,其状态也受多个程序控制;某程序运行时,受到其他程序的影响)
    3) 不可再现性(失去了封闭性,也将导致失去可再现性)
    说明:当多个程序共享一个资源时,由于对资源的访问时刻不定,因此执行结果不定

    假设有一软件变量资源N,设当前N=5,现有两个程序A和B共享该变量,程序A对N的操作为:N:= N +1 ; 程序B对N的操作为:
    先利用Print(N)打印N,然后执行N:=0;由于A和B可以按照不同的速度执行,则语句N:= N +1 ; Print(N) ; N:=0 ; 有可能出现以下几种执行顺序:

    (1) N:=N+1;    Print(N) ;    N=0 ;   N的取值分别是6602Print(N) ;   N:=N+1;     N=0 ;   N的取值分别是5603Print(N) ;   N=0 ;     N:=N+1;   N的取值分别是501

以上结果说明,程序A中变量N的值可能是6,也可能是1,结果是可变的;同样情况,
程序B中打印N时其值有可能是6,也可能是5,结果也是可变的。

程序并发执行,虽然能显著提高系统效率,但是出现了“不可再现性”,这显然是不允许的。既要保证系统的效率,又要保证程序执行的“可再现性”,必须采取适当的措施。这些措施的根本就是要保证并发执行的程序对临界资源的独占性访问。

2. 程序并发执行的条件――Bernstein条件

设程序Pi可对多个变量进行操作(资源),操作分为“读操作”和“写操作”,亦即程序Pi在执行过程中作为参考的所有变量
的集合称为“读集”,在执行过程中需要修改的所有变量的集合称为“写集”,如下定义:

R(Pi) =  {a1, a2 , …,am} ; R(Pi)是Pi的读集

W(Pi) =  {b1 , b2 ,…,bn} ;W(Pi)是Pi的写集  

若两个程序Pi和Pi能满足如下条件,它们便能够并发执行,并具有可再现性:

   R(Pi)∩W(Pj) ∩ W(Pi) ∩R(Pj) ∩W(Pi) ∩W(Pj)  = { }

以上条件是由Bernstein提出的,因此称为Bernstein条件。

理解:只有保证程序Pi的读集和Pj的写集不相交、Pi的写集和Pj的读集不相交、Pi的写集和Pj的写集不相交,
才能保证Pi和Pj并发执行,且保证程序的正确执行(可再现性)。

说明:两个程序可以同时对某变量执行“读操作”,但只要有一个“写操作”,则另一个程序就不能再执行“读操作”,
也不能再执行“写操作”了,即“写操作”是独占临界资源的。

2.进程的基本概念

2.1进程的描述

1.进程:是可执行程序在一个数据集合上的运行过程,是系统资源分配和独立运行的基本单位。
程序:是一组指令的集合,存放在某种介质上,无运动含义,是一个静态实体

进程基本特征为:

1.动态性:进程是进程实体的执行过程,它“由创建而产生,由调度而执行、因得不到资源而暂停执行,
以及由撤消而消亡”。动态性是进程最基本的特征,是同程序不同的。
2.并发性:是多个进程实体同时运行表现出来的特征。并发性说明的是“同一段时间”,同并行性不同。
3.独立性:指的是进程实体是一个能独立运行和获得资源的基本单位。如果某程序没有建立进程,
则不能作为一个独立的单位参与运行。
4.异步性:多个进程各自独立运行,其运行速度是不可预知的。该特种导致了程序执行的不可再现性,
因此操作系统必须采取有效措施保证各程序(进程)之间能协调运行
5.结构特征:进程实体是由程序段、数据段以及进程控制块(PCB)三部分组成的。(很重要)

2.2进程的状态


进程的五种状态:
1.创建状态(New):进程刚刚建立,还未送入就绪队列的状态

2.就绪状态(Ready):进程获得了除处理机(CPU)之外的所有资源,一旦获得了处理机,便可立即执行。一个系统中可有多个进程同时处于就绪状态,这些进程可排成一个或多个队列,这样的队列称为就绪队列

3.执行状态(Execute):进程已经获得处理机,其对应的程序正在执行。单处理机系统中,系统中只有一个进程处于执行状态,而在多处理机系统中,可能有多个进程同时处于执行状态

4.阻塞状态(Block):某进程正在执行重,但是因为某些原因(例如等待I/O)暂时停止了执行,此时进程转入阻塞状态,处理机被剥夺。注意阻塞状态一定是由执行状态转过来的。阻塞状态也称为“睡眠”状态或“等待”状态。同就绪队列近似,系统中处于阻塞状态的进程也排成一个队列,或者根据阻塞原因排成多个队列,这些队列称为阻塞队列
(处于阻塞状态的队列,只有其I/O完成,或者需要的资源得到了,则从阻塞队列重转出,排到就绪队列的尾部,等待接收系统的重新调度)

5.终止状态(Terminated):进程结束(不管正常结束,还是异常结束),操作系统将它从就绪队列中移出,但是还没有撤销时的状态

提示:如果当前进程正在执行,则它仍处于就绪队列中,仅是其PCB中有关进程状态的字段要修改为“正在执行”状态。之所以如此,是因为在进程并发时,进程不可能总占有处理机,操作系统会根据各种不同策略为进程分配处理机,所以进程的执行过程是“走走停停”式的,是在“就绪”――“执行”――“就绪”的状态中来回切换的。

2.3进程的五大基本状态切换

一个进程只有一次新状态和终止状态,但可有多次就绪状态、阻塞状态和执行状态。有以下几种状态转换的情况:

1.创建状态->就绪状态:系统的就绪队列允许接收新的就绪队列时,操作系统就将处于新状态的进程移入就绪队列,此时完成了进程的“新状态”到“就绪状态”的转变
2.就绪状态->执行状态:进程调度程序为就绪队列中优先(如何判断优先?)的进程分配处理机,则该进程由就绪状态变成了执行状态,该进程称为当前进程
3. 执行状态->阻塞状态:当正处于执行状态的进程需要访问临界资源,而临界资源正在被其它资源访问时,或者进程需要等待I/O时,进程将由执行状态变为阻塞状态,进程也将进入阻塞队列
4.执行状态->就绪状态:当前进程时间片用完,或者有更高优先级的进程出现时,当前进程的处理机被剥夺,执行状态就变为就绪状态。注意:仅处理机被剥夺,而其他所有资源还占据的状态是就绪状态,如果资源不完备,或者进程需要I/O,则进入阻塞状态
5.阻塞状态->就绪状态:阻塞进程获得了所需的全部资源(除了处理机),并且I/O也已经完成,则可由阻塞状态转为就绪状态,等待进程处理程序的调度而重新获得处理机
6.执行状态->终止状态:进程完成,不管是正常完成,还是异常结束,都将执行状态变为终止状态,等待系统撤消

2.4进程的挂起状态

是一种新引入的状态,是一种静止状态。处于此状态的进程,得不到处理机调度。处于挂起状态的进程被调出内存,进入外存暂时存放。
其原因可能基于:
1.终端用户的需求
2.父进程的要求
3.操作系统的需求
4.对换的需要
5.负荷调节的需求

注:
1.所谓对换,指的是为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上,此时进程将处于一种有别于阻塞状态的另一种状态,称为静止阻塞状态。该状态的进程即处于挂起状态,确切地说,该进程处于静止阻塞状态,因为即使该进程获得了所有资源,或者其预想的事情(例如I/0)已经发生能够,其仍不具备运行条件,仍不能进入就绪队列

2.引入挂起状态的进程,又增加了从挂起状态(静止状态)到非挂起状态(活动状态)的转换,或者相反。为同原有的就绪、阻塞状态相区别,原有的非挂起状态下的就绪、阻塞状态分别称为活动就绪状态、活动阻塞状态,而挂起状态下的就绪、阻塞状态称为静止就绪状态、静止阻塞状态

如图:

(1)活动就绪->静止就绪(ReadyA->ReadyS)

(2)静止就绪->活动就绪(ReadyS->ReadyA):如果利用激活原语Active将进程激活后,静止就绪状态的进程变为活动就绪状态,此时进程可以再调度执行

(3)活动阻塞->静止阻塞(BlockA->BlockS):利用挂起原语Suspend将进程挂起时,活动阻塞状态的进程变为静止阻塞状态。即使该进程所期待的事件发生了(例如I/O完成),也不能进入活动就绪队列,而只能进入静止就绪队列

(4)静止阻塞->活动阻塞(BlockS->BlockA):如果利用激活原语Active将进程激活后,静止阻塞状态的进程变为活动阻塞状态

2.5进程控制块PCB

进程控制块是进程实体的一部分,是操作系统中最重要的记录型数据结构,PCB中记录了操作系统所需要的,用于描述进程情况及控制进程运行所需的全部信息

PCB的特征:
1.常驻内存
2.是进程存在的唯一标识
3.一个进程对应一个PCB
4.可以被多个系统模块访问
5.OS中有专门的PCB区

PCB中包含的信息:
1.进程标识符信息:例如外部标识符(字母,用户访问进程时使用)、内部标识符(整数,系统使用)、父进程标识符、子进程标识符以及用户标识符(谁拥有该进程)等
2.处理机状态信息:现场保护、现场恢复,例如通用寄存器、PC、PSW、SP等的信息
3.进程调度信息:进程当前状态、优先级、进程调度所需的信息以及阻塞原因(事件)等
4.进程控制信息:例如程序和数据的地址、进程同步和通信机制、资源清单以及链接指针等

PCB的组织方式:
1.链接方式:把具有相同状态的PCB用其中的链接字,链接成一个队列

2.索引方式:系统根据所有进程的状态,建立几张索引表,索引表的每一个表项指向一个PCB的物理块


3.进程的控制

3.1进程控制基本常识

1.处理机的执行状态:系统态和用户态(也称核心态和目态)
①系统态又称核心态,具有较高的特权,能访问所有寄存器和存储区,能执行一切指令。
②用户态又称目态,具有较低的的执行状态,只能执行规定的指令,访问指定的寄存器和存储区。
通常情况下,用户程序运行在用户态,OS内核通常运行在系统态。进程控制就是由OS内核实现的。

2.操作系统内核
操作系统内核是计算机硬件的第一次扩充,内核执行OS与硬件关系密切,执行频率高的模块,它们是常驻内存的。
多数OS包括下述功能:
1.支撑功能:包括中断处理功能、时钟管理功能、原语操作等
2.资源管理功能:包括进程管理、存储器管理、设备管理等

注:中断:计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到现行程序的间断处。这就是“中断”。

3.2进程的创建与终止

1.基本认知:
①进程图:是用于描述进程家族关系的有向树,表现进程之间的父子关系


父进程和子进程关系为:
1.父进程创建子进程
2.子进程继承父进程的资源,文件以及缓冲区
3.子进程随父进程的撤消而撤消
4.子进程撤消时,其从父进程获得的资源全部归还父进程

2.进程的创建和终止条件
进程创建条件:
(1)用户登录
(2)作业调度
(3)提供服务
(4)应用请求

进程终止条件:
(1)正常结束
(2)异常结束(出现错误或故障)
(3)外界干预(例如操作系统干预、父进程干预、父进程终止等)

3.进程创建和终止步骤
进程创建步骤:
(1)申请空白PCB(为进程分配唯一数字标识符,从PCB集合中索取空白PCB块)
(2)为新进程分配资源(为进程的程序和数据,以及用户栈分配内存资源)
(3)初始化进程控制块(包括初始化标识符信息、处理机状态信息以及处理机控制信息)
(4)将新进程插入就绪队列(如就绪队列能够接纳新进程,则插入)

进程终止步骤(OS调用进程终止原语,按下述过程终止指定进程):
(1)从PCB集合中检索当前进程PCB,并从中读出进程状态
(2)终止进程的执行(修改其调度标志为真,以保证终止后应重新调度)
(3)终止子孙进程
(4)释放资源(或归还给其父进程,或归还给系统)
(5)将被终止进程的PCB从它所处的队列中移出

4.进程阻塞与唤醒
1.引起进程阻塞和唤醒的事件:
①请求系统服务,如:打印服务
②启动某种操作,如:启动I/O或启动打印机
③新数据尚未到达
④无新工作可做,发送一消息之后等待的时候

2.进程阻塞过程:
①终止进程的执行,将进程的状态改为阻塞态
②将进程插入相应的阻塞队列
③转进程调度例程,重新进行进程调度,以将CPU分配给其它进程

3.进程唤醒过程:
①将进程从阻塞队列中移出
②将进程状态由阻塞改为就绪
③将进程插入就绪队列。(有可能立即得到调度,也有可能在就绪队列中等待)

5.进程挂起与激活
进程的挂起过程:调用挂起原语suspend( )
suspend的执行过程:
(1)检查被挂起的进程的状态,如正处于活动就绪状态或执行状态,则将其修改为静止就绪状态;如正处于活动阻塞状态,则将其修改为静止阻塞状态
(2)复制改进程的PCB到指定的内存区域,以方便用户或父进程检查其运行情况
(3)如果被挂起的进程正在执行,则转调度程序重新调度新的进程
进程的激活过程:调用激活原语Active()
Active的执行过程:
(1)将进程后外存换入内存
(2)检查现行状态,若是静止就绪(阻塞)状态,则修改为活动就绪(阻塞)状态
(3)如采用抢占调度策略,且有新进程进入就绪队列,则还可能转入进程调度程序:如当前进程优先级较低,则立即剥夺其执行,将处理机分配给刚被激活的进程,否则就不必重新调度,继续原先进程的执行即可


4.进程的同步

OS系统引入进程,提高了系统效率和吞吐量,但是进程运行的异步性,导致了结果的不可再现性和差错,因此必须采取措施保证进程执行结果的可再现性和正确性。这就是进程同步提出的原因。

进程同步的主要任务:使并发执行的进程之间能有效利用资源和相互合作,从而使程序的执行具有可再现性。

4.1.多道程序环境下进程之间的关系

间接相互制约关系(源于资源共享):进程之间彼此无关,互不知道对方的存在。但是处在一个环境之下,运行时需资源共享(如共享CPU和I/O设备)。进程同步的主要任务是保证进程能互斥地访问临界资源。系统中的资源不是由用户进程直接使用的,而是由系统(操作系统)统一分配的。亦即:用户进程要使用某资源,必须首先咨询系统:资源被其他进程占有吗?如果占有,则当前进程或等待,或进入阻塞状态;如果资源处于空闲状态,则当前进程占有该资源,继续执行,执行完毕后,释放资源,其他进程方可再次占有该资源。

直接相互制约关系(源于进程之间相互合作):如果进程之间具有某种合作关系,例如进程A的输出作为进程B的输入。则进程同步的目的是保证进程A和进程B在执行次序上协调一致,不会出现与时间有关的差错。后面介绍到的“生产者-消费者”问题就是一个典型的具有合作关系的进程同步问题。

4.2临界资源和临界区

临界资源:一段时间内只允许一个进程访问的资源。临界资源要求“独占”,即要被“互斥”地被访问。
以“生产者-消费者”问题为例:


5.线程的基本概念

5.1线程概率的引入

1.线程的引入(减少时空开销,提高系统的并发性)

上个世纪60年代,进程的概念被提出,在OS中进程一直作为资源分配合独立运行的基本单位。直到80年代中期,
人们又提出了比进程更小的能独立运行的基本单位――线程

提出线程的目的是为了进一步提高系统内程序并发执行的程度,进一步提高系统吞吐量。目前新近推出的OS和
DBMS中都引入了线程的概念

引入线程的目的:为了减少程序并发执行时所付出的时空开销,保证OS具有更好的并发性。为保证程序能并
运行,系统必须进行以下操作:创建进程、撤消进程和进程切换,而这一切,系统都必须付出较大的时空开销

多个进程进入内存,可保证良好的并发性,但是进程越多,切换的频率越大,系统为之付出的时空开销就越
大,实际上系统的性能将有所降低。如果既要保证并发性,又要减少系统时空开销,则必须采取新的措施。
由此,线程被提出了。

线程:线程是进程的一个实体,是被系统独立调度和分派的基本单位。线程由进程生成,本身基本上不拥有资源,仅有一点自己的运行过程中必不可少的资源(例如程序计数器、堆栈等),但是它可以利用创建它的进程的所有资源。一个进程可以创建多个线程,线程也可以创建或撤消另一个线程,这些线程共享进程的资源。同一个进程的线程之间可以并发执行,线程之间相互制约,也呈现间断性(异步性),因此,线程也同样拥有就绪、阻塞和执行三种基本状态,有的系统中还有终止状态

5.2线程和进程的比较

线程:轻型进程(Light-Weight Process),也称为进程元。
进程:重型进程(Heavy-Weight Process)。

一个进程都有若干个线程,至少有一个线程。线程和进程有一些相似之处,下面我们从调度、并发性、拥有资源、系统开销等方面对它们进行比较。

调度:传统OS中,进程是资源分配和独立执行的基本单位,而在引入线程的OS中,进程仅是资源拥有的基本单位,线程称为调度和分派的基本单位。进程的两个属性(资源分配,独立执行)被分开,从而线程可轻装上阵,可提高系统并发程度

同一进程的线程切换不会引起进程的切换,不同进程的线程的切换将会引起进程切换

并发性:在引入线程的OS中,不仅进程之间可以并发,同一进程之间的线程也可以并发,从而有效提高了并发程度

拥有资源:进程是拥有资源的,而线程基本上不拥有资源,但是同一个进程的线程可以共享进程的资源

系统开销:进程的创建和撤销,系统都需要为之分配和撤销资源(如内存空间、I/O设备等),而系统创建线程实,没有资源分配合撤销的问题,因此系统开销远远小于进程;同时,进程切换时,系统需要保护旧进程的线程、设置新进程的初始环境,也需要很大的系统开销,而线程切换时,除了保护几个优先的寄存器之外,不涉及有关存储器管理的有关方面,因此系统开销非常小。另外,由于同一进程的线程占有相同的地址空间,线程同步和通讯的开销也非常小

线程分为用户级线程和内核支持线程


补充:
1.进程时间片用完进入就绪状态
2.临界资源是互斥共享资源
3.进程和程序的本质区别是前者是动态的,后者是静态的
4.PV操作:P请求资源,V释放资源,PV操作会改变信号量(执行V操作时,如果信号量值<=0,释放一个等待信号量的进程)
5.从用户态转换为核心态的唯一途径:系统调用
6.IO请求,进程由执行态—>阻塞态,IO完成由阻塞态—>就绪态

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值