好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

计算机操作系统第2章.ppt

264页
  • 卖家[上传人]:博****1
  • 文档编号:577196748
  • 上传时间:2024-08-21
  • 文档格式:PPT
  • 文档大小:1,023.52KB
  • / 264 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第二章 进 程 管 理 第二章 进 程 管 理 2.1 进程的基本概念 进程的基本概念 2.2 进程控制 进程控制 2.3 进程同步 进程同步 2.4 经典进程的同步问题 经典进程的同步问题 2.5 进程通信进程通信 2.6 线程 线程 第二章 进 程 管 理 2.1 进程的基本概念 进程的基本概念 2.1.1 程序的顺序执行及其特征 程序的顺序执行及其特征  1. 程序的顺序执行程序的顺序执行  通常可以把一个应用程序分成若干个程序段,在各程序  通常可以把一个应用程序分成若干个程序段,在各程序段之间,必须按照某种先后次序顺序执行,仅当前一操作段之间,必须按照某种先后次序顺序执行,仅当前一操作(程程序段序段)执行完后,才能执行后继操作执行完后,才能执行后继操作 第二章 进 程 管 理 例如,在进行计算时,总须先输入用户的程序和数据,例如,在进行计算时,总须先输入用户的程序和数据,然后进行计算,最后才能打印计算结果然后进行计算,最后才能打印计算结果 这里,我们用结点这里,我们用结点(Node)代表各程序段的操作代表各程序段的操作(在图在图2-1中中用圆圈表示用圆圈表示),其中,,其中,I代表输入操作,代表输入操作,C代表计算操作,代表计算操作,P为为打印操作;打印操作; 另外,用箭头指示操作的先后次序。

      这样,上述的三个另外,用箭头指示操作的先后次序这样,上述的三个程序段的执行顺序可示于图程序段的执行顺序可示于图2-1(a)中 对一个程序段中的多条语句来说,也有一个执行顺序问对一个程序段中的多条语句来说,也有一个执行顺序问题,例如对于下述三条语句的程序段题,例如对于下述三条语句的程序段: 第二章 进 程 管 理 S1: a:=x+y;;S2: b:=a-5;;S3: c:=b+1;; 其中,语句其中,语句S2必须在语句必须在语句S1之后之后(即即a被赋值被赋值)才能执行;同样,才能执行;同样,语句语句S3也只能在也只能在b被赋值后才能执行因此,这三条语句应按被赋值后才能执行因此,这三条语句应按图图2-1(b)所示的顺序执行所示的顺序执行 第二章 进 程 管 理 图图 2-1 程序的顺序执行 程序的顺序执行 第二章 进 程 管 理     2. 程序顺序执行时的特征程序顺序执行时的特征    (1) (1) 顺顺序序性性::处处理理机机的的操操作作严严格格按按照照程程序序所所规规定定的的顺顺序序执行,即每一操作必须在上一个操作结束之后开始执行,即每一操作必须在上一个操作结束之后开始。

          (2) (2) 封封闭闭性性::程程序序是是在在封封闭闭的的环环境境下下执执行行的的,,即即程程序序运运行行时时独独占占全全机机资资源源,,资资源源的的状状态态( (除除初初始始状状态态外外) )只只有有本本程程序序才才能能改改变变它它程程序序一一旦旦开开始始执执行行,,其其执执行行结结果果不不受受外外界界因因素素影响影响    (3) (3) 可可再再现现性性::只只要要程程序序执执行行时时的的环环境境和和初初始始条条件件相相同同,,当当程程序序重重复复执执行行时时,,不不论论它它是是从从头头到到尾尾不不停停顿顿地地执执行行,,还还是是“停停走走停停走走”地执行,都将获得相同的结果地执行,都将获得相同的结果  程序顺序执行时的特性,为程序员检测和校正程序的错  程序顺序执行时的特性,为程序员检测和校正程序的错误带来了很大的方便误带来了很大的方便 第二章 进 程 管 理 2.1.2 前趋图 前趋图    前趋图前趋图(Precedence Graph)是一个有向无循环图,是一个有向无循环图,记为记为DAG(Directed Acyclic Graph),用于描述进程之间执行的前,用于描述进程之间执行的前后关系。

      后关系 图中的每个图中的每个结点结点可用于描述一个可用于描述一个程序段程序段或或进程进程,乃至一,乃至一条语句;结点间的条语句;结点间的有向边有向边则用于表示两个结点之间存在的则用于表示两个结点之间存在的偏偏序序(Partial Order,亦称偏序关系,亦称偏序关系)或或前趋关系前趋关系(Precedence Relation)“→→” 第二章 进 程 管 理     →→={(Pi,,Pj)|Pi must complete before Pj may start},如,如果果(Pi,,Pj)∈→∈→,可写成,可写成Pi→→Pj,称,称Pi是是Pj的的直接前趋直接前趋,而称,而称Pj是是Pi的的直接后继直接后继 在前趋图中,把没有前趋的结点称为在前趋图中,把没有前趋的结点称为初始结点初始结点(Initial Node),把没有后继的结点称为,把没有后继的结点称为终止结点终止结点(Final Node) 此外,每个结点还具有一个重量此外,每个结点还具有一个重量(Weight),用于表示该,用于表示该结点所含有的结点所含有的程序量程序量或或结点的执行时间结点的执行时间。

      第二章 进 程 管 理   在图  在图2-1(a)和和2-1(b)中分别存在着这样的前趋关系:中分别存在着这样的前趋关系: Ii→→Ci→→Pi S1→→S2→→S3 和 第二章 进 程 管 理 对于图对于图2-2(a)所示的前趋图,存在下述前趋关系:所示的前趋图,存在下述前趋关系:     P1→P2,,P1→P3,,P1→P4,,P2→P5,,P3→P5,,P4→P6,,P4→P7,,P5→P8,,P6→P8,,P7→P9,,P8→P9前前驱图2-2(a)表示表示为::G=(P, →)  其中,  其中,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)}   应当注意,前趋图中必须不存在循环,但在图  应当注意,前趋图中必须不存在循环,但在图2-2(b)中却中却有着下述的前趋关系:有着下述的前趋关系: S2→→S3,,S3→→S2 第二章 进 程 管 理 图 2-2 前趋图 第二章 进 程 管 理 2.1.3 程序的并发执行及其特征 程序的并发执行及其特征    1.程序的并发执行.程序的并发执行  在图在图2-1中的输入程序、计算程序和打印程序三者之间,中的输入程序、计算程序和打印程序三者之间,存在着存在着Ii→→Ci→→Pi这样的前趋关系,以至对一个作业的输入、这样的前趋关系,以至对一个作业的输入、计算和打印三个操作,必须顺序执行,但并不存在计算和打印三个操作,必须顺序执行,但并不存在Pi→→Ii+1的的关系,因而在对一批程序进行处理时,可使它们并发执行。

      关系,因而在对一批程序进行处理时,可使它们并发执行 第二章 进 程 管 理 例例如如,,输输入入程程序序在在输输入入第第一一个个程程序序后后,,在在计计算算程程序序对对该该程程序序进进行行计计算算的的同同时时,,可可由由输输入入程程序序再再输输入入第第二二个个程程序序,,从从而而使使第第一一个个程程序序的的计计算算操操作作可可与与第第二二个个程程序序的的输输入入操操作作并并发发执行 一一般般来来说说,,输输入入程程序序在在输输入入第第i+1个个程程序序时时,,计计算算程程序序可可能能正正在在对对第第i个个程程序序进进行行计计算算,,而而打打印印程程序序正正在在打打印印第第i- -1个个程程序的计算结果序的计算结果 图图2-3示示出出了了输输入入、、计计算算和和打打印印这这三三个个程程序序对对一一批批作作业业进进行处理的情况行处理的情况 第二章 进 程 管 理 图2-3 并发执行时的前趋图 第二章 进 程 管 理 在该例中存在下述前趋关系:在该例中存在下述前趋关系: 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+2S2: b:=y+4S3: c:=a+bS4: d:=c+b 第二章 进 程 管 理 图图 2-4 四条语句的前趋关系 四条语句的前趋关系 第二章 进 程 管 理     2 2.程序并发执行时的特征.程序并发执行时的特征    1) 1) 间断性间断性  程序在并发执行时,由于它们共享系统资源,以及为完  程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间,成同一项任务而相互合作,致使在这些并发执行的程序之间,形成了相互制约的关系例如,图形成了相互制约的关系例如,图2-3 中的中的I、、C和和P是三个相是三个相互合作的程序,当计算程序完成互合作的程序,当计算程序完成Ci--1的计算后,如果输入程的计算后,如果输入程序序I尚未完成尚未完成Ii的处理,则计算程序就无法进行的处理,则计算程序就无法进行Ci的处理,致的处理,致使计算程序必须暂停运行又如,当打印程序完成使计算程序必须暂停运行又如,当打印程序完成Pi的打印的打印后,若计算程序尚未完成后,若计算程序尚未完成Ci++1的计算,则打印程序就无法对的计算,则打印程序就无法对Ci++1的计算结果进行打印。

      一旦使程序暂停的因素消失后的计算结果进行打印一旦使程序暂停的因素消失后(如如Ii已处理完成已处理完成),计算程序便可恢复执行对,计算程序便可恢复执行对Ci的处理简而言之,的处理简而言之,相互制约将导致并发程序具有相互制约将导致并发程序具有“执行执行—暂停暂停—执行执行”这种间这种间断性的活动规律断性的活动规律 第二章 进 程 管 理     2 2.程序并发执行时的特征.程序并发执行时的特征    1) 1) 间断性间断性  程序在并发执行时,由于它们共享系统资源,以及为完  程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间,成同一项任务而相互合作,致使在这些并发执行的程序之间,形成了相互制约的关系例如,图形成了相互制约的关系例如,图2-3 中的中的I、、C和和P是三个相是三个相互合作的程序,当计算程序完成互合作的程序,当计算程序完成Ci--1的计算后,如果输入程的计算后,如果输入程序序I尚未完成尚未完成Ii的处理,则计算程序就无法进行的处理,则计算程序就无法进行Ci的处理,致的处理,致使计算程序必须暂停运行又如,当打印程序完成使计算程序必须暂停运行。

      又如,当打印程序完成Pi的打印的打印后,若计算程序尚未完成后,若计算程序尚未完成Ci++1的计算,则打印程序就无法对的计算,则打印程序就无法对Ci++1的计算结果进行打印一旦使程序暂停的因素消失后的计算结果进行打印一旦使程序暂停的因素消失后(如如Ii已处理完成已处理完成),计算程序便可恢复执行对,计算程序便可恢复执行对Ci的处理简而言之,的处理简而言之,相互制约将导致并发程序具有相互制约将导致并发程序具有“执行执行—暂停暂停—执行执行”这种间这种间断性的活动规律断性的活动规律 第二章 进 程 管 理     2) 2) 失去封闭性失去封闭性    程序在并发执行时,是多个程序共享系统中的各种资源程序在并发执行时,是多个程序共享系统中的各种资源,,因而这些资源的状态将由多个程序来改变,致使程序的运行因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性失去了封闭性 这样,某程序在执行时,必然会受到其它程序的影响这样,某程序在执行时,必然会受到其它程序的影响例如,当处理机这一资源已被某个程序占有时,另一程序必例如,当处理机这一资源已被某个程序占有时,另一程序必须等待。

      须等待 第二章 进 程 管 理     3) 3) 不可再现性不可再现性  程序在并发执行时,由于失去了封闭性,也将导致其再  程序在并发执行时,由于失去了封闭性,也将导致其再失去可再现性例如,有两个循环程序失去可再现性例如,有两个循环程序A和和B,它们共享一个,它们共享一个变量变量N程序A每执行一次时,都要做每执行一次时,都要做N:=N+1操作;程序操作;程序B每每执行一次时,都要执行执行一次时,都要执行Print(N)操作,然后再将操作,然后再将N置成置成“0”程序程序A和和B以不同的速度运行这样,可能出现下述三种情况以不同的速度运行这样,可能出现下述三种情况(假定某时刻变量假定某时刻变量N的值为的值为n) 第二章 进 程 管 理     (1) N:=N+1(1) N:=N+1在在Print(N)Print(N)和和N:=0N:=0之前,此时得到的之前,此时得到的N N值分值分别为别为n+1n+1,,n+1n+1,,0 0    (2) N:=N+1(2) N:=N+1在在Print(N)Print(N)和和N:=0N:=0之后,此时得到的之后,此时得到的N N值分值分别为别为n n,,0 0,,1 1。

          (3) N:=N+1(3) N:=N+1在在Print(N)Print(N)和和N:=0N:=0之间,此时得到的之间,此时得到的N N值分值分别为别为n n,,n+1n+1,,0 0  上述情况说明,程序在并发执行时,由于失去了封闭性,  上述情况说明,程序在并发执行时,由于失去了封闭性,其计算结果已与并发程序的执行速度有关,从而使程序的执其计算结果已与并发程序的执行速度有关,从而使程序的执行失去了可再现性,亦即,程序经过多次执行后,虽然它们行失去了可再现性,亦即,程序经过多次执行后,虽然它们执行时的环境和初始条件相同,但得到的结果却各不相同执行时的环境和初始条件相同,但得到的结果却各不相同 第二章 进 程 管 理 2.1.42.1.4 进程的特征与状态 进程的特征与状态    1. 1. 进程的特征和定义进程的特征和定义  在多道程序环境下,程序的执行属于并发执行,此时它  在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性,并具有间断性及不可再现性的特征们将失去其封闭性,并具有间断性及不可再现性的特征 这决定了通常的程序是不能参与并发执行的,因为程序这决定了通常的程序是不能参与并发执行的,因为程序执行的结果是不可再现的。

      这样,程序的运行也就失去了意执行的结果是不可再现的这样,程序的运行也就失去了意义 为使程序能并发执行,且为了对并发执行的程序加以描为使程序能并发执行,且为了对并发执行的程序加以描述和控制,人们引入了述和控制,人们引入了“进程进程”的概念为了能较深刻地了的概念为了能较深刻地了解什么是进程,我们将先对进程的特征加以描述解什么是进程,我们将先对进程的特征加以描述 第二章 进 程 管 理     1) 1) 结构特征结构特征  通常的程序是不能并发执行的为使程序  通常的程序是不能并发执行的为使程序(含数据含数据)能独立能独立运行,应为之配置一运行,应为之配置一进程控制块进程控制块,即,即PCB(Process Control Block);而由程序段、相关的数据段和;而由程序段、相关的数据段和PCB三部分便构成了三部分便构成了进进程实体程实体 在早期的在早期的UNIX版本中,把这三部分总称为版本中,把这三部分总称为“进程映像进程映像”值得指出的是,在许多情况下所说的进程,实际上是指值得指出的是,在许多情况下所说的进程,实际上是指进程进程实体实体,例如,,例如,所谓创建进程,实质上是创建进程实体中的所谓创建进程,实质上是创建进程实体中的PCB;;而撤消进程,实质上是撤消进程的而撤消进程,实质上是撤消进程的PCB,,本教材中也本教材中也是如此。

      是如此 第二章 进 程 管 理     2) 2) 动态性动态性    进程的实质是进程实体的一次执行过程进程的实质是进程实体的一次执行过程,因此,,因此,动态性是动态性是进程的最基本的特征进程的最基本的特征 动态性还表现在:动态性还表现在:“它由创建而产生,由调度而执行,由它由创建而产生,由调度而执行,由撤消而消亡撤消而消亡” 可见,进程实体有一定的生命期,而程序则只是一组有序可见,进程实体有一定的生命期,而程序则只是一组有序指令的集合,并存放于某种介质上,其本身并不具有运动的含指令的集合,并存放于某种介质上,其本身并不具有运动的含义,因而是义,因而是静态静态的 第二章 进 程 管 理     3) 3) 并发性并发性    这这是是指指多多个个进进程程实实体体同同存存于于内内存存中中,,且且能能在在一一段段时时间间内内同时运行同时运行 并发性是进程的重要特征,同时也成为并发性是进程的重要特征,同时也成为OSOS的重要特征的重要特征 引引入入进进程程的的目目的的也也正正是是为为了了使使其其进进程程实实体体能能和和其其它它进进程程实体并发执行;而程序实体并发执行;而程序( (没有建立没有建立PCB)PCB)是不能并发执行的。

      是不能并发执行的     第二章 进 程 管 理     4) 4) 独立性独立性  在传统的  在传统的OS中,独立性是指进程实体是一个能中,独立性是指进程实体是一个能独立运行独立运行、、独立分配资源独立分配资源和和独立接受调度的独立接受调度的基本单位基本单位 凡未建立凡未建立PCB的程序都不能作为一个独立的单位参与运的程序都不能作为一个独立的单位参与运行      第二章 进 程 管 理     5) 5) 异步性异步性    这这是是指指进进程程按按各各自自独独立立的的、、 不不可可预预知知的的速速度度向向前前推推进进,,或说进程实体按异步方式运行或说进程实体按异步方式运行 第二章 进 程 管 理     现现在在我我们们再再来来讨讨论论进进程程的的定定义义曾曾有有许许多多人人从从不不同同的的角角度对进程下过定义,其中较典型的进程定义有:度对进程下过定义,其中较典型的进程定义有:    (1) (1) 进程是程序的一次执行进程是程序的一次执行    (2) (2) 进进程程是是一一个个程程序序及及其其数数据据在在处处理理机机上上顺顺序序执执行行时时所所发生的活动发生的活动。

          (3) 进程是程序在一个数据集合上运行的过程,它是系统进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位进行资源分配和调度的一个独立单位 第二章 进 程 管 理     2. 2. 进程的三种基本状态进程的三种基本状态    进进程程执执行行时时的的间间断断性性决决定定了了进进程程可可能能具具有有多多种种状状态态事实上,运行中的进程可能具有以下三种基本状态事实上,运行中的进程可能具有以下三种基本状态    1) 1) 就绪就绪(Ready)(Ready)状态状态  当进程已分配到除  当进程已分配到除CPU以外的所有必要资源后,只要以外的所有必要资源后,只要再获得再获得CPU,便可立即执行,进程这时的状态称为就绪状,便可立即执行,进程这时的状态称为就绪状态 在一个系统中处于就绪状态的进程可能有多个,通常在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为将它们排成一个队列,称为就绪队列就绪队列 第二章 进 程 管 理     2) 2) 执行状态执行状态  进程已获得  进程已获得CPUCPU,其程序正在执行其程序正在执行。

      在在单单处处理理机机系系统统中中,,只只有有一一个个进进程程处处于于执执行行状状态态;;在在多多处处理机系统中,则有多个进程处于执行状态理机系统中,则有多个进程处于执行状态 第二章 进 程 管 理     3) 3) 阻塞状态阻塞状态  正在执行的进程由于发生某事件而暂时无法继续执行时,  正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为这种暂停状态称为阻塞状态阻塞状态,有时也称为,有时也称为等待状态等待状态或或封锁状态封锁状态 致使进程阻塞的典型事件有:请求致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等申请缓冲空间等 通常将这种处于阻塞状态的进程也排成通常将这种处于阻塞状态的进程也排成一个队列一个队列有的系统则根据阻塞原因的不同而把处于阻塞状态的进程排成统则根据阻塞原因的不同而把处于阻塞状态的进程排成多个队多个队列列 第二章 进 程 管 理 图图2-5 进程的三种基本状态及其转换进程的三种基本状态及其转换 第二章 进 程 管 理     3. 3. 挂起状态挂起状态    1) 1) 引入挂起状态的原因引入挂起状态的原因    在在不不少少系系统统中中进进程程只只有有上上述述三三种种状状态态,,但但在在另另一一些些系系统统中中,,又增加了一些新状态,最重要的是挂起状态。

      又增加了一些新状态,最重要的是挂起状态 第二章 进 程 管 理   引入挂起状态的原因有:  引入挂起状态的原因有:    (1) 终端用户的请求终端用户的请求 当终端用户在自己的程序运行期间发现有可疑问题时,希当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来望暂时使自己的程序静止下来 亦即,使正在执行的进程暂停执行;亦即,使正在执行的进程暂停执行; 若此时用户进程正处于就绪状态而未执行,则该进程暂不若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改我们接受调度,以便用户研究其执行情况或对程序进行修改我们把这种静止状态称为把这种静止状态称为挂起状态挂起状态    第二章 进 程 管 理     (2) (2) 父进程请求父进程请求 有有时时父父进进程程希希望望挂挂起起自自己己的的某某个个子子进进程程,,以以便便考考查查和和修修改该子进程,或者协调各子进程间的活动改该子进程,或者协调各子进程间的活动    (3) (3) 负荷调节的需要负荷调节的需要 当当实实时时系系统统中中的的工工作作负负荷荷较较重重,,已已可可能能影影响响到到对对实实时时任任务务的的控控制制时时,,可可由由系系统统把把一一些些不不重重要要的的进进程程挂挂起起,,以以保保证证系系统能正常运行。

      统能正常运行    (4) 操作系统的需要操作系统的需要 操作系统有时希望挂起某些进程,以便检查运行中的资操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账源使用情况或进行记账 第二章 进 程 管 理     2) 2) 进程状态的转换进程状态的转换    在在引引入入挂挂起起状状态态后后,,又又将将增增加加从从挂挂起起状状态态( (又又称称为为静静止止状状态态) )到到非非挂挂起起状状态态( (又又称称为为活活动动状状态态) )的的转转换换;;或或者者相相反反可可有有以下几种情况:以下几种情况:    (1) 活动就绪活动就绪→→静止就绪静止就绪 当进程处于未被挂起的就绪状态时,称此为当进程处于未被挂起的就绪状态时,称此为活动就绪状活动就绪状态态,表示为,表示为Readya当用挂起原语当用挂起原语Suspend将该进程挂起后,将该进程挂起后,该进程便转变为该进程便转变为静止就绪状态静止就绪状态,表示为,表示为Readys,处于,处于Readys状态的进程不再被调度执行状态的进程不再被调度执行 第二章 进 程 管 理 图 2-6 具有挂起状态的进程状态图 第二章 进 程 管 理     (2) (2) 活活动动阻阻塞塞→→静静止止阻阻塞塞。

      当当进进程程处处于于未未被被挂挂起起的的阻阻塞塞状状态态时时,,称称它它是是处处于于活活动动阻阻塞塞状状态态,,表表示示为为BlockedaBlockeda当当用用SuspendSuspend原原语语将将它它挂挂起起后后,,进进程程便便转转变变为为静静止止阻阻塞塞状状态态,,表表示示为为BlockedsBlockeds处处于于该该状状态态的的进进程程在在其其所所期期待待的的事事件件出出现现后后,,将将从静止阻塞变为静止就绪从静止阻塞变为静止就绪    (3) (3) 静静止止就就绪绪→→活活动动就就绪绪处处于于ReadysReadys状状态态的的进进程程,,若若用激活原语用激活原语ActiveActive激活后,该进程将转变为激活后,该进程将转变为ReadyaReadya状态    (4) 静止阻塞静止阻塞→→活动阻塞处于活动阻塞处于Blockeds状态的进程,若状态的进程,若用激活原语用激活原语Active激活后,该进程将转变为激活后,该进程将转变为Blockeda状态图图2-6示出了具有挂起状态的进程状态图示出了具有挂起状态的进程状态图 第二章 进 程 管 理     4 4.创建状态和终止状态.创建状态和终止状态    1) 1) 创建状态创建状态  创建一个进程一般要通过两个步骤:  创建一个进程一般要通过两个步骤: 首先,为一个新进程创建首先,为一个新进程创建PCB,并填写必要的管理信息;,并填写必要的管理信息; 其次,把该进程转入就绪状态并插入就绪队列之中。

      其次,把该进程转入就绪状态并插入就绪队列之中 第二章 进 程 管 理     当当一一个个新新进进程程被被创创建建时时,,系系统统已已为为其其分分配配了了PCB,,填填写写了了进进程程标标识识等等信信息息,,但但由由于于该该进进程程所所必必需需的的资资源源或或其其它它信信息息,,如如主主存存资资源源尚尚未未分分配配等等,,一一般般而而言言,,此此时时的的进进程程已已拥拥有有了了自自己己的的PCB,,但但进进程程自自身身还还未未进进入入主主存存,,即即创创建建工工作作尚尚未未完完成成,,进程还不能被调度运行,其所处的状态就是进程还不能被调度运行,其所处的状态就是创建状态创建状态 第二章 进 程 管 理   引入创建状态,是为了保证进程的调度必须在创建工作  引入创建状态,是为了保证进程的调度必须在创建工作完成后进行,以确保对进程控制块操作的完整性完成后进行,以确保对进程控制块操作的完整性 同时,创建状态的引入,也增加了管理的灵活性,操作同时,创建状态的引入,也增加了管理的灵活性,操作系统可以根据系统性能或主存容量的限制,推迟创建状态进系统可以根据系统性能或主存容量的限制,推迟创建状态进程的提交。

      程的提交 对于处于创建状态的进程,获得了其所必需的资源,以对于处于创建状态的进程,获得了其所必需的资源,以及对其及对其PCBPCB初始化工作完成后,初始化工作完成后,进程状态便可由创建状态转入进程状态便可由创建状态转入就绪状态就绪状态 第二章 进 程 管 理     2) 2) 终止状态终止状态  进程的终止也要通过两个步骤:  进程的终止也要通过两个步骤: 首首先先等等待待操操作作系系统统进进行行善善后后处处理理,,然然后后将将其其PCBPCB清清零零,,并将并将PCBPCB空间返还系统空间返还系统 第二章 进 程 管 理     当当一一个个进进程程到到达达了了自自然然结结束束点点,,或或是是出出现现了了无无法法克克服服的的错错误误,,或或是是被被操操作作系系统统所所终终结结,,或或是是被被其其他他有有终终止止权权的的进进程程所终结,它将进入所终结,它将进入终止状态终止状态 进进入入终终止止态态的的进进程程以以后后不不能能再再执执行行,,但但在在操操作作系系统统中中依依然然保保留留一一个个记记录录,,其其中中保保存存状状态态码码和和一一些些计计时时统统计计数数据据,,供供其其它它进进程程收收集集。

      一一旦旦其其它它进进程程完完成成了了对对终终止止状状态态进进程程的的信信息息提取之后,操作系统将删除该进程提取之后,操作系统将删除该进程  图  图2-7示出了增加了创建状态和终止状态后,进程的三种示出了增加了创建状态和终止状态后,进程的三种基本状态及转换图衍变为五种状态及转换关系图基本状态及转换图衍变为五种状态及转换关系图    第二章 进 程 管 理 图2-7 进程的五种基本状态及转换 第二章 进 程 管 理 图图2-8 具有创建、终止和挂起状态的进程状态图具有创建、终止和挂起状态的进程状态图 第二章 进 程 管 理     如如图图2-82-8所所示示,,引引进进创创建建和和终终止止状状态态后后,,在在进进程程状状态态转转换换时时,,相相比比较较图图2-72-7所所示示的的进进程程五五状状态态转转换换而而言言,,需需要要增增加加考考虑虑下面的几种情况下面的几种情况    (1) NULL→(1) NULL→创建:创建: 一个新进程产生时,该进程处于创建状态一个新进程产生时,该进程处于创建状态    (2) 创建创建→→活动就绪:活动就绪: 在当前系统的性能和内存的容量均允许的情况下,完成在当前系统的性能和内存的容量均允许的情况下,完成对进程创建的必要操作后,相应的系统进程将进程的状态转对进程创建的必要操作后,相应的系统进程将进程的状态转换为活动就绪状态。

      换为活动就绪状态 第二章 进 程 管 理     (3) (3) 创建创建→→静止就绪:静止就绪: 考考虑虑到到系系统统当当前前资资源源状状况况和和性性能能要要求求,,并并不不分分配配给给新新建建进进程程所所需需资资源源,,主主要要是是主主存存资资源源,,相相应应的的系系统统进进程程将将进进程程状状态态转转为为静静止止就就绪绪状状态态,,对对换换到到外外存存,,不不再再参参与与调调度度,,此时进程创建工作尚未完成此时进程创建工作尚未完成    (4) 执行执行→→终止:终止: 当一个进程到达了自然结束点,或是出现了无法克服当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,进程即进进程所终结,进程即进终止状态终止状态 第二章 进 程 管 理 2.1.52.1.5 进程控制块 进程控制块    1 1.进程控制块的作用.进程控制块的作用  为了描述和控制进程的运行,系统为每个进程定义了一个  为了描述和控制进程的运行,系统为每个进程定义了一个数据结构数据结构——进程控制块进程控制块PCB(Process Control Block),它是进,它是进程实体的一部分,是操作系统中最重要的记录型数据结构。

      程实体的一部分,是操作系统中最重要的记录型数据结构 PCB中记录了操作系统所需的、用于描述进程的当前情况中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息以及控制进程运行的全部信息 进程控制块的作用进程控制块的作用是使一个在多道程序环境下不能独立运是使一个在多道程序环境下不能独立运行的程序行的程序(含数据含数据),,成为成为一个能独立运行的基本单位,一个能一个能独立运行的基本单位,一个能与其它进程与其它进程并发执行并发执行的进程 第二章 进 程 管 理   或者说,  或者说,OS是根据是根据PCB来对并发执行的进程进行控制和来对并发执行的进程进行控制和管理的例如:管理的例如:•当当OS要调度某进程执行时,要从该进程的要调度某进程执行时,要从该进程的PCB中查出其现行中查出其现行状态及优先级;状态及优先级;•在调度到某进程后,要根据其在调度到某进程后,要根据其PCB中所保存的处理机状态信中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其息,设置该进程恢复运行的现场,并根据其PCB中的程序和数中的程序和数据的内存始址,找到其程序和数据;据的内存始址,找到其程序和数据; •进程在执行过程中,当需要和与之合作的进程实现同步、通进程在执行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也都需要访问信或访问文件时,也都需要访问PCB;;•当进程由于某种原因而暂停执行时,又须将其断点的处理机当进程由于某种原因而暂停执行时,又须将其断点的处理机环境保存在环境保存在PCB中。

      中 第二章 进 程 管 理   可见,在进程的整个生命期中,系统总是通过  可见,在进程的整个生命期中,系统总是通过PCB对进程对进程进行控制的,亦即,进行控制的,亦即,系统是根据进程的系统是根据进程的PCB而不是任何别的什而不是任何别的什么而感知到该进程的存在的么而感知到该进程的存在的 所以说,所以说,PCB是进程存在的惟一标志是进程存在的惟一标志 第二章 进 程 管 理   当系统创建一个新进程时,就为它建立了一个  当系统创建一个新进程时,就为它建立了一个PCB;进;进程结束时又回收其程结束时又回收其PCB,进程于是也随之消亡进程于是也随之消亡 PCB可以被操作系统中的多个模块读或修改,如被调度可以被操作系统中的多个模块读或修改,如被调度程序、资源分配程序、中断处理程序以及监督和分析程序等程序、资源分配程序、中断处理程序以及监督和分析程序等读或修改读或修改 因为因为PCB经常被系统访问,尤其是被运行频率很高的进经常被系统访问,尤其是被运行频率很高的进程及分派程序访问,故程及分派程序访问,故PCB应常驻内存应常驻内存 第二章 进 程 管 理     系统将所有的系统将所有的PCB组织成若干个链表组织成若干个链表(或队列或队列),存放在,存放在操作系统中专门开辟的操作系统中专门开辟的PCB区内。

      区内 例如在例如在Linux系统中用系统中用task_struct数据结构来描述每个进数据结构来描述每个进程的进程控制块,在程的进程控制块,在Windows操作系统中则使用一个执行体操作系统中则使用一个执行体进程块进程块(EPROCESS)来表示进程对象的基本属性来表示进程对象的基本属性 第二章 进 程 管 理     2 2.进程控制块中的信息.进程控制块中的信息    1) 1) 进程标识符进程标识符    进进程程标标识识符符用用于于惟惟一一地地标标识识一一个个进进程程一一个个进进程程通通常常有有两两种标识符:种标识符:    (1)(1)内内部部标标识识符符在在所所有有的的操操作作系系统统中中,,都都为为每每一一个个进进程程赋赋予予了了一一个个惟惟一一的的数数字字标标识识符符,,它它通通常常是是一一个个进进程程的的序序号号设设置内部标识符主要是为了方便系统使用置内部标识符主要是为了方便系统使用    (2) 外部标识符外部标识符它由创建者提供,通常是由字母、数字它由创建者提供,通常是由字母、数字组成,往往是由用户组成,往往是由用户(进程进程)在访问该进程时使用在访问该进程时使用。

      为了描述进程的家族关系,还应设置为了描述进程的家族关系,还应设置父进程标识父进程标识及及子进程子进程标识标识此外,还可设置此外,还可设置用户标识用户标识,以指示拥有该进程的用户以指示拥有该进程的用户 第二章 进 程 管 理     2) 2) 处理机状态处理机状态  处理机状态信息主要是由处理机的各种寄存器中的内容  处理机状态信息主要是由处理机的各种寄存器中的内容组成的 处理机在运行时,许多信息都放在寄存器中处理机在运行时,许多信息都放在寄存器中 当处理机被中断时,所有这些信息都必须保存在当处理机被中断时,所有这些信息都必须保存在PCB中,中,以便在该进程重新执行时,能从断点继续执行以便在该进程重新执行时,能从断点继续执行 第二章 进 程 管 理   这些寄存器包括:  这些寄存器包括:①① 通通用用寄寄存存器器,,又又称称为为用用户户可可视视寄寄存存器器,,它它们们是是用用户户程程序序可可以以访访问问的的,,用用于于暂暂存存信信息息,,在在大大多多数数处处理理机机中中,,有有 8~~32个个通通用寄存器,在用寄存器,在RISC结构的计算机中可超过结构的计算机中可超过100个;个;②② 指令计数器,其中存放了要访问的下一条指令的地址;指令计数器,其中存放了要访问的下一条指令的地址;③③ 程程序序状状态态字字PSW,,其其中中含含有有状状态态信信息息,,如如条条件件码码、、执执行行方方式、中断屏蔽标志等;式、中断屏蔽标志等;④④ 用用户户栈栈指指针针,,指指每每个个用用户户进进程程都都有有一一个个或或若若干干个个与与之之相相关关的的系系统统栈栈,,用用于于存存放放过过程程和和系系统统调调用用参参数数及及调调用用地地址址,,栈栈指指针指向该栈的栈顶。

      针指向该栈的栈顶 第二章 进 程 管 理     3) 3) 进程调度信息进程调度信息  在  在PCB中还存放一些与进程调度和进程对换有关的信息,中还存放一些与进程调度和进程对换有关的信息,包括:包括:①① 进程状态,指明进程的当前状态,作为进程调度和对换时进程状态,指明进程的当前状态,作为进程调度和对换时的依据;的依据;②② 进程优先级,用于描述进程使用处理机的优先级别的一个进程优先级,用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机;整数,优先级高的进程应优先获得处理机;     第二章 进 程 管 理 ③③ 进程调度所需的其它信息,它们与所采用的进程调度算法进程调度所需的其它信息,它们与所采用的进程调度算法有关,比如,进程已等待有关,比如,进程已等待CPU的时间总和、进程已执行的时的时间总和、进程已执行的时间总和等;间总和等;④④ 事件,指进程由执行状态转变为阻塞状态所等待发生的事事件,指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因件,即阻塞原因      第二章 进 程 管 理     4) 4) 进程控制信息进程控制信息  进程控制信息包括:  进程控制信息包括:①① 程序和数据的地址,指进程的程序和数据所在的内存或外程序和数据的地址,指进程的程序和数据所在的内存或外存地存地(首首)址,以便再调度到该进程执行时,能从址,以便再调度到该进程执行时,能从PCB中找到其中找到其程序和数据;程序和数据;②② 进程同步和通信机制,指实现进程同步和进程通信时必需进程同步和通信机制,指实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,它们可能全部或部分的机制,如消息队列指针、信号量等,它们可能全部或部分地放在地放在PCB中;中; 第二章 进 程 管 理 ③③ 资资源源清清单单,,即即一一张张列列出出了了除除CPU以以外外的的、、进进程程所所需需的的全全部部资源及已经分配到该进程的资源的清单;资源及已经分配到该进程的资源的清单;④④ 链链接接指指针针,,它它给给出出了了本本进进程程(PCB)所所在在队队列列中中的的下下一一个个进进程的程的PCB的首地址。

      的首地址 第二章 进 程 管 理     3. 3. 进程控制块的组织方式进程控制块的组织方式    1) 1) 链接方式链接方式  这是把具有同一状态的  这是把具有同一状态的PCB,用其中的链接字链接成一,用其中的链接字链接成一个队列这样,可以形成个队列这样,可以形成就绪队列就绪队列、、若干个阻塞队列若干个阻塞队列和和空白空白队列队列等 对其中的就绪队列对其中的就绪队列常按进程优先级的高低排列常按进程优先级的高低排列,把优先,把优先级高的进程的级高的进程的PCB排在队列前面排在队列前面 此外,也可根据阻塞原因的不同而把处于阻塞状态的进此外,也可根据阻塞原因的不同而把处于阻塞状态的进程的程的PCB排成等待排成等待I/O操作完成的队列和等待分配内存的队列操作完成的队列和等待分配内存的队列等图2-9示出了一种链接队列的组织方式示出了一种链接队列的组织方式 第二章 进 程 管 理 图 2-9 PCB链接队列示意图 第二章 进 程 管 理     2) 2) 索引方式 索引方式   系统根据所有进程的状态建立几张索引表  系统根据所有进程的状态建立几张索引表 例如,就绪索引表、阻塞索引表等,并把各索引表在例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。

      内存的首地址记录在内存的一些专用单元中 在每个索引表的表目中,记录具有相应状态的某个在每个索引表的表目中,记录具有相应状态的某个PCB在在PCB表中的地址表中的地址 图图2-10示出了索引方式的示出了索引方式的PCB组织 第二章 进 程 管 理 图 2-10 按索引方式组织PCB 第二章 进 程 管 理 2.2 进 进 程程 控控 制制     进程控制是进程管理中最基本的功能进程控制是进程管理中最基本的功能它用于创建一个它用于创建一个新进程,终止一个已完成的进程,或终止一个因出现某事件新进程,终止一个已完成的进程,或终止一个因出现某事件而使其无法运行下去的进程,还可负责进程运行中的状态转而使其无法运行下去的进程,还可负责进程运行中的状态转换 如当一个正在执行的进程因等待某事件而暂时不能继续如当一个正在执行的进程因等待某事件而暂时不能继续执行时,将其转换为阻塞状态,而当该进程所期待的事件出执行时,将其转换为阻塞状态,而当该进程所期待的事件出现时,又将该进程转换为就绪状态等等现时,又将该进程转换为就绪状态等等 进程控制一般是由进程控制一般是由OS的内核中的原语来实现的的内核中的原语来实现的。

      第二章 进 程 管 理     原语原语(Primitive)是由若干条指令组成的,用于完成一定是由若干条指令组成的,用于完成一定功能的一个过程功能的一个过程 它与一般过程的区别在于:它们是它与一般过程的区别在于:它们是“原子操作原子操作(Action Operation)” 所谓所谓原子操作原子操作,是指一个操作中的所有动作要么全做,,是指一个操作中的所有动作要么全做,要么全不做换言之,它是一个不可分割的基本单位,因此,要么全不做换言之,它是一个不可分割的基本单位,因此,在执行过程中不允许被中断在执行过程中不允许被中断 原子操作在管态下执行,常驻内存原子操作在管态下执行,常驻内存 第二章 进 程 管 理 2.2.12.2.1 进程的创建 进程的创建    1 1.进程图.进程图(Process Graph)(Process Graph)    进程图是用于描述一个进程的家族关系的有向树进程图是用于描述一个进程的家族关系的有向树,如图,如图2-11所示 图中的结点图中的结点(圆圈圆圈)代表进程在进程代表进程在进程D创建了进程创建了进程I之后,之后,称称D是是I的的父进程父进程(Parent Process),,I是是D的的子进程子进程(Progeny Process)。

      第二章 进 程 管 理 图2-11 进程树 第二章 进 程 管 理     2 2.引起创建进程的事件.引起创建进程的事件    在在多多道道程程序序环环境境中中,,只只有有( (作作为为) )进进程程( (时时) )才才能能在在系系统统中中运运行行因因此此,,为为使使程程序序能能运运行行,,就就必必须须为为它它创创建建进进程程导导致致一个进程去创建另一个进程的典型事件,可有以下四类:一个进程去创建另一个进程的典型事件,可有以下四类:    (1)(1)用用户户登登录录在在分分时时系系统统中中,,用用户户在在终终端端键键入入登登录录命命令令后后,,如如果果是是合合法法用用户户,,系系统统将将为为该该终终端端建建立立一一个个进进程程,,并并把把它插入就绪队列中它插入就绪队列中    (2) 作业调度作业调度在批处理系统中,当作业调度程序按一定在批处理系统中,当作业调度程序按一定的算法调度到某作业时,便将该作业装入内存,为它分配必的算法调度到某作业时,便将该作业装入内存,为它分配必要的资源,并立即为它创建进程,再插入就绪队列中要的资源,并立即为它创建进程,再插入就绪队列中      第二章 进 程 管 理     (3) 提供服务提供服务。

      当运行中的用户程序提出某种请求后,系统将专门创建当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务,例如,用户程序要求进一个进程来提供用户所需要的服务,例如,用户程序要求进行文件打印,操作系统将为它创建一个行文件打印,操作系统将为它创建一个打印进程打印进程,这样,不,这样,不仅可使打印进程与该用户进程并发执行,而且还便于计算出仅可使打印进程与该用户进程并发执行,而且还便于计算出为完成打印任务所花费的时间为完成打印任务所花费的时间 第二章 进 程 管 理     (4) 应用请求应用请求 在上述三种情况下,都是由系统内核为它创建一个新进在上述三种情况下,都是由系统内核为它创建一个新进程;而第程;而第4类事件则是基于应用进程的需求,由它自己创建类事件则是基于应用进程的需求,由它自己创建一个新进程,以便使新进程以并发运行方式完成特定任务一个新进程,以便使新进程以并发运行方式完成特定任务 例如,某应用程序需要不断地从键盘终端输入数据,继例如,某应用程序需要不断地从键盘终端输入数据,继而又要对输入数据进行相应的处理,然后,再将处理结果以而又要对输入数据进行相应的处理,然后,再将处理结果以表格形式在屏幕上显示。

      表格形式在屏幕上显示 该应用进程为使这几个操作能并发执行,以加速任务的该应用进程为使这几个操作能并发执行,以加速任务的完成,完成,可以分别建立键盘输入进程、表格输出进程可以分别建立键盘输入进程、表格输出进程 第二章 进 程 管 理     3 3.进程的创建.进程的创建(Creation of Process)(Creation of Process)    一一旦旦操操作作系系统统发发现现了了要要求求创创建建新新进进程程的的事事件件后后,,便便调调用用进程创建原语进程创建原语Creat( )Creat( )按下述步骤创建一个新进程按下述步骤创建一个新进程    (1) 申请空白申请空白PCB为新进程申请获得惟一的数字标识符,为新进程申请获得惟一的数字标识符,并从并从PCB集合中索取一个空白集合中索取一个空白PCB      第二章 进 程 管 理     (2) 为新进程分配资源为新进程分配资源 为新进程的程序和数据以及用户栈分配必要的内存空间为新进程的程序和数据以及用户栈分配必要的内存空间显然,此时操作系统必须知道新进程所需内存的大小显然,此时操作系统必须知道新进程所需内存的大小。

      对于批处理作业对于批处理作业,其大小可在用户提出创建进程要求时,其大小可在用户提出创建进程要求时提供若是为应用进程创建子进程若是为应用进程创建子进程,也应是在该进程提出创,也应是在该进程提出创建进程的请求中给出所需内存的大小建进程的请求中给出所需内存的大小对于交互型作业对于交互型作业,用,用户可以不给出内存要求而由系统分配一定的空间户可以不给出内存要求而由系统分配一定的空间 如果新进程要如果新进程要共享某个已在内存的地址空间共享某个已在内存的地址空间(即已装入内即已装入内存的共享段存的共享段),则必须建立相应的链接则必须建立相应的链接 第二章 进 程 管 理     (3) (3) 初始化进程控制块初始化进程控制块 PCBPCB的的初初始始化化包包括括::① ① 初初始始化化标标识识信信息息,,将将系系统统分分配配的的标标识识符符和和父父进进程程标标识识符符填填入入新新PCBPCB中中;;② ② 初初始始化化处处理理机机状状态态信信息息,,使使程程序序计计数数器器指指向向程程序序的的入入口口地地址址,,使使栈栈指指针针指指向向栈栈顶顶;;③ ③ 初初始始化化处处理理机机控控制制信信息息,,将将进进程程的的状状态态设设置置为为就就绪绪状状态态或或静静止止就就绪绪状状态态,,对对于于优优先先级级,,通通常常是是将将它它设设置置为为最最低低优先级,除非用户以显式方式提出高优先级要求。

      优先级,除非用户以显式方式提出高优先级要求    (4) 将新进程插入就绪队列将新进程插入就绪队列 如果进程就绪队列能够接纳新进程,便将新进程插入就如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列 第二章 进 程 管 理 2.2.22.2.2 进程的终止 进程的终止    1 1.引起进程终止的事件.引起进程终止的事件    1) 1) 正常结束正常结束  在任何计算机系统中,都应有一个用于表示进程已经运  在任何计算机系统中,都应有一个用于表示进程已经运行完成的指示行完成的指示 例如,在批处理系统中,通常在程序的最后安排一条例如,在批处理系统中,通常在程序的最后安排一条Halt指令或终止的系统调用当程序运行到指令或终止的系统调用当程序运行到Halt指令时,将指令时,将产生一个中断,去通知产生一个中断,去通知OS本进程已经完成本进程已经完成 在分时系统中,用户可利用在分时系统中,用户可利用Logs off去表示进程运行完去表示进程运行完毕,此时同样可产生一个中断,去通知毕,此时同样可产生一个中断,去通知OS进程已运行完毕进程已运行完毕。

      第二章 进 程 管 理     2) 2) 异常结束异常结束  在进程运行期间,由于出现某些错误和故障而迫使进程终  在进程运行期间,由于出现某些错误和故障而迫使进程终止止(Termination of Process)(Termination of Process)这类异常事件很多,常见的有这类异常事件很多,常见的有下述几种:下述几种:    (1)(1)越界错误这是指程序所访问的存储区已越出该进程越界错误这是指程序所访问的存储区已越出该进程的区域    (2)(2)保护错这是指进程试图去访问一个不允许访问的资保护错这是指进程试图去访问一个不允许访问的资源或文件,或者以不适当的方式进行访问,例如,进程试图去源或文件,或者以不适当的方式进行访问,例如,进程试图去写一个只读文件写一个只读文件    (3) 非法指令这是指程序试图去执行一条不存在的指令非法指令这是指程序试图去执行一条不存在的指令出现该错误的原因,可能是程序错误地转移到数据区,把数据出现该错误的原因,可能是程序错误地转移到数据区,把数据当成了指令当成了指令 第二章 进 程 管 理     (4)(4)特特权权指指令令错错。

      这这是是指指用用户户进进程程试试图图去去执执行行一一条条只只允允许许OSOS执行的指令执行的指令    (5)(5)运运行行超超时时这这是是指指进进程程的的执执行行时时间间超超过过了了指指定定的的最最大大值    (6)(6)等等待待超超时时这这是是指指进进程程等等待待某某事事件件的的时时间间超超过过了了规规定定的最大值的最大值    (7)(7)算算术术运运算算错错这这是是指指进进程程试试图图去去执执行行一一个个被被禁禁止止的的运运算,例如被算,例如被0 0除    (8) I/O故障这是指在故障这是指在I/O过程中发生了错误等过程中发生了错误等 第二章 进 程 管 理     3) 3) 外界干预外界干预    外外界界干干预预并并非非指指在在本本进进程程运运行行中中出出现现了了异异常常事事件件,,而而是是指进程应外界的请求而终止运行这些干预有:指进程应外界的请求而终止运行这些干预有:    (1)(1)操操作作员员或或操操作作系系统统干干预预由由于于某某种种原原因因,,例例如如,,发发生生了死锁,由操作员或操作系统终止该进程了死锁,由操作员或操作系统终止该进程    (2)(2)父父进进程程请请求求。

      由由于于父父进进程程具具有有终终止止自自己己的的任任何何子子孙孙进进程的权力,因而当父进程提出请求时,系统将终止该进程程的权力,因而当父进程提出请求时,系统将终止该进程    (3) 父进程终止当父进程终止时,父进程终止当父进程终止时,OS也将它的所有子也将它的所有子孙进程终止孙进程终止 第二章 进 程 管 理     2 2.进程的终止过程.进程的终止过程    如如果果系系统统中中发发生生了了上上述述要要求求终终止止进进程程的的某某事事件件,,OSOS便便调调用进程终止原语,按下述过程去终止指定的进程用进程终止原语,按下述过程去终止指定的进程    (1)(1)根根据据被被终终止止进进程程的的标标识识符符,,从从PCBPCB集集合合中中检检索索出出该该进进程的程的PCBPCB,从中读出该进程的状态从中读出该进程的状态    (2) 若被终止进程正处于执行状态,应立即终止该进程若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度新进行调度 第二章 进 程 管 理     (3)(3)若若该该进进程程还还有有子子孙孙进进程程,,还还应应将将其其所所有有子子孙孙进进程程予予以终止,以防它们成为不可控的进程。

      以终止,以防它们成为不可控的进程    (4)(4)将将被被终终止止进进程程所所拥拥有有的的全全部部资资源源,,或或者者归归还还给给其其父父进程,或者归还给系统进程,或者归还给系统    (5) 将被终止进程将被终止进程(PCB)从所在队列从所在队列(或链表或链表)中移出,等中移出,等待其他程序来搜集信息待其他程序来搜集信息 第二章 进 程 管 理 2.2.32.2.3 进程的阻塞与唤醒 进程的阻塞与唤醒    1. 1. 引起进程阻塞和唤醒的事件引起进程阻塞和唤醒的事件  有下述几类事件会引起进程阻塞或被唤醒  有下述几类事件会引起进程阻塞或被唤醒    1)1)请求系统服务请求系统服务  当正在执行的进程请求操作系统提供服务时,  当正在执行的进程请求操作系统提供服务时,由于某种由于某种原因,操作系统并不立即满足该进程的要求时,该进程只能原因,操作系统并不立即满足该进程的要求时,该进程只能转变为阻塞状态来等待转变为阻塞状态来等待例如,一进程请求使用某资源,如例如,一进程请求使用某资源,如打印机,由于系统已将打印机分配给其他进程而不能分配给打印机,由于系统已将打印机分配给其他进程而不能分配给请求进程,这时请求者进程只能被阻塞,仅在其他进程在释请求进程,这时请求者进程只能被阻塞,仅在其他进程在释放出打印机的同时,才将请求进程唤醒。

      放出打印机的同时,才将请求进程唤醒 第二章 进 程 管 理     2)2)启动某种操作启动某种操作  当进程启动某种操作后,如果该进程必须在该操作完成  当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则必须先使该进程阻塞,以等待该操作之后才能继续执行,则必须先使该进程阻塞,以等待该操作完成 例如,进程启动了某例如,进程启动了某I/O设备,如果只有在设备,如果只有在I/O设备完成设备完成了指定的了指定的I/O操作任务后进程才能继续执行,则该进程在启动操作任务后进程才能继续执行,则该进程在启动了了I/O操作后,便自动进入阻塞状态去等待在操作后,便自动进入阻塞状态去等待在I/O操作完成操作完成后,再由中断处理程序或中断进程将该进程唤醒后,再由中断处理程序或中断进程将该进程唤醒 第二章 进 程 管 理     3)3)新数据尚未到达新数据尚未到达  对于相互合作的进程,如果其中一个进程需要先获得另  对于相互合作的进程,如果其中一个进程需要先获得另一一(合作合作)进程提供的数据后才能对数据进行处理,则只要其进程提供的数据后才能对数据进行处理,则只要其所需数据尚未到达,该进程只有所需数据尚未到达,该进程只有(等待等待)阻塞。

      阻塞 例如,有两个进程,进程例如,有两个进程,进程A用于输入数据,进程用于输入数据,进程B对输对输入数据进行加工假如入数据进行加工假如A尚未将数据输入完毕,则进程尚未将数据输入完毕,则进程B将将因没有所需的处理数据而阻塞;一旦进程因没有所需的处理数据而阻塞;一旦进程A把数据输入完毕,把数据输入完毕,便可去唤醒进程便可去唤醒进程B 第二章 进 程 管 理     4)4)无新工作可做无新工作可做  系统往往设置一些具有某特定功能的系统进程,每当这  系统往往设置一些具有某特定功能的系统进程,每当这种进程完成任务后,便把自己阻塞起来以等待新任务到来种进程完成任务后,便把自己阻塞起来以等待新任务到来 例如,系统中的发送进程,其主要工作是发送数据,若例如,系统中的发送进程,其主要工作是发送数据,若已有的数据已全部发送完成而又无新的发送请求,这时已有的数据已全部发送完成而又无新的发送请求,这时(发送发送)进程将使自己进入阻塞状态;进程将使自己进入阻塞状态; 仅当又有进程提出新的发送请仅当又有进程提出新的发送请求时,才将发送进程唤醒求时,才将发送进程唤醒 第二章 进 程 管 理     2 2.进程阻塞过程.进程阻塞过程  正在执行的进程,当发现上述某事件时,由于无法继续  正在执行的进程,当发现上述某事件时,由于无法继续执行,于是执行,于是进程便通过调用阻塞原语进程便通过调用阻塞原语block把自己阻塞把自己阻塞。

      可见,可见,进程的阻塞是进程自身的一种主动行为进程的阻塞是进程自身的一种主动行为 第二章 进 程 管 理 进进入入block过过程程后后,,由由于于此此时时该该进进程程还还处处于于执执行行状状态态,,所所以以应应先先立立即即停停止止执执行行,,把把进进程程控控制制块块中中的的现现行行状状态态由由“执执行行”改为改为“阻塞阻塞”,并将,并将PCB插入阻塞队列插入阻塞队列 如如果果系系统统中中设设置置了了因因不不同同事事件件而而阻阻塞塞的的多多个个阻阻塞塞队队列列,,则应将本进程插入到具有相同事件的阻塞则应将本进程插入到具有相同事件的阻塞(等待等待)队列 最最后后,,转转调调度度程程序序进进行行重重新新调调度度,,将将处处理理机机分分配配给给另另一一就就绪绪进进程程并并进进行行切切换换,,亦亦即即,,保保留留被被阻阻塞塞进进程程的的处处理理机机状状态态(在在PCB中中),,再再按按新新进进程程的的PCB中中的的处处理理机机状状态态设设置置CPU的的环境 第二章 进 程 管 理     3 3.进程唤醒过程.进程唤醒过程    当当被被阻阻塞塞进进程程所所期期待待的的事事件件出出现现时时,,如如I/OI/O完完成成或或其其所所期期待待的的数数据据已已经经到到达达,,则则由由有有关关进进程程( (比比如如用用完完并并释释放放了了该该I/OI/O设设备备的的进进程程) )调调用用唤唤醒醒原原语语wakeup( wakeup( ) ),,将将等等待待该该事事件件的的进进程程唤醒。

      唤醒 唤醒原语执行的过程是唤醒原语执行的过程是: :(1)(1)首先把被阻塞的进程从等待该事件的阻塞队列中移出,首先把被阻塞的进程从等待该事件的阻塞队列中移出,(2)(2)将其将其PCBPCB中的现行状态由阻塞改为就绪,中的现行状态由阻塞改为就绪,(3)(3)然后再将该然后再将该PCBPCB插入到就绪队列中插入到就绪队列中 第二章 进 程 管 理   应当指出,  应当指出,block原语和原语和wakeup原语是一对作用刚好相原语是一对作用刚好相反的原语反的原语 因此,因此,如果在某进程中调用了阻塞原语,则必须在与之如果在某进程中调用了阻塞原语,则必须在与之相合作的另一进程中或其他相关的进程中安排唤醒原语,以相合作的另一进程中或其他相关的进程中安排唤醒原语,以能唤醒阻塞进程;能唤醒阻塞进程;否则,被阻塞进程将会因不能被唤醒而长否则,被阻塞进程将会因不能被唤醒而长久地处于阻塞状态,从而再无机会继续运行久地处于阻塞状态,从而再无机会继续运行 第二章 进 程 管 理 2.2.42.2.4 进程的挂起与激活 进程的挂起与激活    1 1.进程的挂起.进程的挂起  当出现了引起进程挂起的事件时,比如,用户进程  当出现了引起进程挂起的事件时,比如,用户进程请求请求将自己挂起,或父进程将自己挂起,或父进程请求请求将自己的某个子进程挂起,系统将自己的某个子进程挂起,系统将利用挂起原语将利用挂起原语suspend( )将指定进程或处于阻塞状态的进程将指定进程或处于阻塞状态的进程挂起。

      挂起 第二章 进 程 管 理 挂起原语的执行过程是:挂起原语的执行过程是: 首首先先检检查查被被挂挂起起进进程程的的状状态态,,若若处处于于活活动动就就绪绪状状态态,,便便将将其其改改为为静静止止就就绪绪;;对对于于活活动动阻阻塞塞状状态态的的进进程程,,则则将将之之改改为为静止阻塞静止阻塞 为为了了方方便便用用户户或或父父进进程程考考查查该该进进程程的的运运行行情情况况而而把把该该进进程的程的PCB复制到某指定的内存区域复制到某指定的内存区域 最最后后,,若若被被挂挂起起的的进进程程正正在在执执行行,,则则转转向向调调度度程程序序重重新新调度 第二章 进 程 管 理     2 2.进程的激活过程.进程的激活过程  当发生激活进程的事件时,例如,父进程或用户进程请  当发生激活进程的事件时,例如,父进程或用户进程请求激活指定进程,若该进程驻留在外存而内存中已有足够的求激活指定进程,若该进程驻留在外存而内存中已有足够的空间时,则可将在外存上处于静止就绪状态的该进程换入内空间时,则可将在外存上处于静止就绪状态的该进程换入内存这时,系统将利用激活原语存。

      这时,系统将利用激活原语active( )将指定进程激活将指定进程激活 第二章 进 程 管 理     激激活活原原语语先先将将进进程程从从外外存存调调入入内内存存,,检检查查该该进进程程的的现现行行状状态态,,若若是是静静止止就就绪绪,,便便将将之之改改为为活活动动就就绪绪;;若若为为静静止止阻阻塞塞,,便将之改为活动阻塞便将之改为活动阻塞 假假如如采采用用的的是是抢抢占占调调度度策策略略,,则则每每当当有有新新进进程程进进入入就就绪绪队队列列时时,,应应检检查查是是否否要要进进行行重重新新调调度度,,即即由由调调度度程程序序将将被被激激活活进进程程与与当当前前进进程程进进行行优优先先级级的的比比较较,,如如果果被被激激活活进进程程的的优优先先级级更更低低,,就就不不必必重重新新调调度度;;否否则则,,立立即即剥剥夺夺当当前前进进程程的的运运行,把处理机分配给刚被激活的进程行,把处理机分配给刚被激活的进程 第二章 进 程 管 理 2.3 进 进 程程 同同 步步 2.3.12.3.1 进程同步的基本概念 进程同步的基本概念    1 1.两种形式的制约关系.两种形式的制约关系  在在多多道道程程序序环环境境下下,,当当程程序序并并发发执执行行时时,,由由于于资资源源共共享享和和进进程程合合作作,,使使同同处处于于一一个个系系统统中中的的诸诸进进程程之之间间可可能能存存在在着着以下两种形式的制约关系。

      以下两种形式的制约关系 第二章 进 程 管 理     (1) 间接相互制约关系间接相互制约关系 同处于一个系统中的进程,通常都共享着某种系统资源,同处于一个系统中的进程,通常都共享着某种系统资源,如共享如共享CPU、共享、共享I/O设备等 所谓所谓间接相互制约间接相互制约即源于这种资源共享,例如,有两个即源于这种资源共享,例如,有两个进程进程A和和B,如果在,如果在A进程提出打印请求时,系统已将惟一的进程提出打印请求时,系统已将惟一的一台打印机分配给了进程一台打印机分配给了进程B,则此时进程,则此时进程A只能阻塞;一旦进只能阻塞;一旦进程程B将打印机释放,则将打印机释放,则A进程才能由阻塞改为就绪状态进程才能由阻塞改为就绪状态 第二章 进 程 管 理     (2) 直接相互制约关系直接相互制约关系 这种制约主要源于进程间的合作这种制约主要源于进程间的合作 例如,有一输入进程例如,有一输入进程A通过单缓冲向进程通过单缓冲向进程B提供数据当提供数据当该缓冲空时,计算进程因不能获得所需数据而阻塞,而当进该缓冲空时,计算进程因不能获得所需数据而阻塞,而当进程程A把数据输入缓冲区后,便将进程把数据输入缓冲区后,便将进程B唤醒;反之,当缓冲区唤醒;反之,当缓冲区已满时,进程已满时,进程A因不能再向缓冲区投放数据而阻塞,当进程因不能再向缓冲区投放数据而阻塞,当进程B将缓冲区数据取走后便可唤醒将缓冲区数据取走后便可唤醒A。

      第二章 进 程 管 理    2. 2. 临界资源临界资源  在第一章中我们曾经介绍过,许多硬件资源如打印机、在第一章中我们曾经介绍过,许多硬件资源如打印机、磁带机等,都属于磁带机等,都属于临界资源临界资源(Critical Resouce),诸进程间应,诸进程间应采取互斥方式,实现对这种资源的共享下面我们将通过一采取互斥方式,实现对这种资源的共享下面我们将通过一个简单的例子来说明这一过程个简单的例子来说明这一过程 第二章 进 程 管 理   生产者生产者-消费者消费者(producer-consumer)问题是一个著名的进问题是一个著名的进程同步问题程同步问题 它描述的是:有它描述的是:有一群一群生产者进程在生产产品,并将这些生产者进程在生产产品,并将这些产品提供给消费者进程去消费产品提供给消费者进程去消费 为使生产者进程与消费者进程能并发执行,在两者之间为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。

      走产品去消费 第二章 进 程 管 理 尽管所有的生产者进程和消费者进程都是以异步方式运尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品品且尚未被取走的缓冲区中投放产品 第二章 进 程 管 理   我们可利用一个数组来表示上述的具有  我们可利用一个数组来表示上述的具有n个个(0,,1,,…,,n-1)缓冲区的缓冲池用输入指针缓冲区的缓冲池用输入指针in来指示下一个可投放产品的来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1;用一个输出指针;用一个输出指针out来指示下一个可从中获取产品的缓冲区,来指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加每当消费者进程取走一个产品后,输出指针加1由于这里的由于这里的缓冲池是组织成循环缓冲的,故应把输入指针加缓冲池是组织成循环缓冲的,故应把输入指针加1表示成表示成 in:= (in+1)mod n;; 输出指针加输出指针加1表示成表示成out:= (out+1) mod n。

      当当 (in+1) mod n=out时表示缓冲池满;而时表示缓冲池满;而in=out则表示缓冲池空则表示缓冲池空此外,还引入了一个整型变量此外,还引入了一个整型变量counter,其初始值为,其初始值为0每当生产者进程向缓冲池中投放一个产品后,使产者进程向缓冲池中投放一个产品后,使counter加加1;反之,;反之,每当消费者进程从中取走一个产品时,使每当消费者进程从中取走一个产品时,使counter减减1生产者和消费者两进程共享下面的变量:和消费者两进程共享下面的变量: 第二章 进 程 管 理 Var nVar n,,integerinteger;;type item=type item=…;;var buffer: arrayvar buffer: array[[0 0,,1 1,,…,,n-1n-1]] of itemof item;;inin,,out: 0out: 0,,1 1,,…,,n-1n-1;;counter: 0,,1,,…,,n;; 第二章 进 程 管 理   指针  指针in和和out初始化为初始化为1在生产者和消费者进程的描述在生产者和消费者进程的描述中,中,noop是一条空操作指令,是一条空操作指令,while condition do no-op语句语句表示重复的测试条件表示重复的测试条件(condication),重复测试应进行到该条,重复测试应进行到该条件变为件变为false(假假),即到该条件不成立时为止。

      即到该条件不成立时为止 在生产者进程中使用一局部变量在生产者进程中使用一局部变量nextp,用于暂时存放每,用于暂时存放每次刚生产出来的产品;而在消费者进程中,则使用一个局部次刚生产出来的产品;而在消费者进程中,则使用一个局部变量变量nextc,用于存放每次要消费的产品用于存放每次要消费的产品 第二章 进 程 管 理 producer: repeatproducer: repeat           produce an item in nextpproduce an item in nextp;;          while counter=n do no-opwhile counter=n do no-op;;bufferbuffer[[inin]]:=nextp:=nextp;;in:=in+1 mod nin:=in+1 mod n;;counter:=counter+1counter:=counter+1;;until false;; …… 第二章 进 程 管 理 consumer: repeat         while counter=0 do no-op;;          nextc:=buffer[[out];];          out:=(out+1) mod n;;          counter:=counter-1;;          consumer the item in nextc;;         until false;; 第二章 进 程 管 理  虽然上面的生产者程序和消费者程序在分别看时都是正确 虽然上面的生产者程序和消费者程序在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时就会出现差错,问题就在于这两个进程共享变量执行时就会出现差错,问题就在于这两个进程共享变量counter。

      生产者对它做加生产者对它做加1操作,消费者对它做减操作,消费者对它做减1操作,这操作,这两个操作在用机器语言实现时,两个操作在用机器语言实现时, 常可用下面的形式描述:常可用下面的形式描述: register1:=counter;;   register2:=counter;;register1:=register1+1; ; register2:=register2-1;;counter:=register1;;   counter:=register2;; 第二章 进 程 管 理   假设  假设counter的当前值是的当前值是5如果生产者进程先执行左列如果生产者进程先执行左列的三条机器语言语句,然后消费者进程再执行右列的三条语的三条机器语言语句,然后消费者进程再执行右列的三条语句,则最后共享变量句,则最后共享变量counter的值仍为的值仍为5;; 反之,如果让消费反之,如果让消费者进程先执行右列的三条语句,然后再让生产者进程执行左者进程先执行右列的三条语句,然后再让生产者进程执行左列的三条语句,则列的三条语句,则counter值也还是值也还是5,但是,如果按下述顺,但是,如果按下述顺序执行:序执行: 第二章 进 程 管 理 register1:=counter;; (register1=5)register1:=register1+1;; (register1=6)register2:=counter;; (register2=5)register2:=register2-1;; (register2=4)counter:=register1;; (counter=6)counter:=register2;; (counter=4) 第二章 进 程 管 理   正确的  正确的counter值应当是值应当是5,但现在是,但现在是4。

      读者可以自己试读者可以自己试试,倘若再将两段程序中各语句交叉执行的顺序改变,将可试,倘若再将两段程序中各语句交叉执行的顺序改变,将可看到又可能得到看到又可能得到counter=6的答案,这表明程序的执行已经失的答案,这表明程序的执行已经失去了再现性为了预防产生这种错误,解决此问题的关键是去了再现性为了预防产生这种错误,解决此问题的关键是应把变量应把变量counter作为临界资源处理,亦即,令生产者进程和作为临界资源处理,亦即,令生产者进程和消费者进程互斥地访问变量消费者进程互斥地访问变量counter 第二章 进 程 管 理     3.临界区.临界区  由前所述可知,不论是硬件临界资源,还是软件临界资  由前所述可知,不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问人们把在每个进程源,多个进程必须互斥地对它进行访问人们把在每个进程中访问临界资源的那段代码称为中访问临界资源的那段代码称为临界区临界区(critical section) 显然,若能保证诸进程互斥地进入自己的临界区,便可实显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。

      现诸进程对临界资源的互斥访问 第二章 进 程 管 理     为为此此,,每每个个进进程程在在进进入入临临界界区区之之前前,,应应先先对对欲欲访访问问的的临临界资源进行检查,看它是否正被访问界资源进行检查,看它是否正被访问 如如果果此此刻刻该该临临界界资资源源未未被被访访问问,,进进程程便便可可进进入入临临界界区区对对该该资资源源进进行行访访问问,,并并设设置置它它正正被被访访问问的的标标志志;;如如果果此此刻刻该该临临界资源正被某进程访问,则本进程不能进入临界区界资源正被某进程访问,则本进程不能进入临界区 因因此此,,必必须须在在临临界界区区前前面面增增加加一一段段用用于于进进行行上上述述检检查查的的代代码,把这段代码称为码,把这段代码称为进入区进入区(entry section) 相相应应地地,,在在临临界界区区后后面面也也要要加加上上一一段段称称为为退退出出区区(exit section)的的代代码码,,用用于于将将临临界界区区正正被被访访问问的的标标志志恢恢复复为为未未被被访访问的标志问的标志 第二章 进 程 管 理     进进程程中中除除上上述述进进入入区区、、临临界界区区及及退退出出区区之之外外的的其其它它部部分分的的代代码码,,在在这这里里都都称称为为剩剩余余区区。

      这这样样,,可可把把一一个个访访问问临临界界资资源的循环进程描述如下:源的循环进程描述如下:    repeat        entry section        critical section;;        exit section        remainder section;;    until false;; 第二章 进 程 管 理     4.同步机制应遵循的规则.同步机制应遵循的规则    为为实实现现进进程程互互斥斥地地进进入入自自已已的的临临界界区区,,可可用用软软件件方方法法,,更更多多的的是是在在系系统统中中设设置置专专门门的的同同步步机机构构来来协协调调各各进进程程间间的的运运行所有同步机制都应遵循下述四条准则:行所有同步机制都应遵循下述四条准则:    (1)空空闲闲让让进进当当无无进进程程处处于于临临界界区区时时,,表表明明临临界界资资源源处处于于空空闲闲状状态态,,应应允允许许一一个个请请求求进进入入临临界界区区的的进进程程立立即即进进入入自自己的临界区,以有效地利用临界资源己的临界区,以有效地利用临界资源    (2) 忙则等待当已有进程进入临界区时,表明临界资忙则等待。

      当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问以保证对临界资源的互斥访问    第二章 进 程 管 理     (3) 有有限限等等待待对对要要求求访访问问临临界界资资源源的的进进程程,,应应保保证证在在有有限时间内能进入自己的临界区,以免陷入限时间内能进入自己的临界区,以免陷入“死等死等”状态    (4) 让权等待当进程不能进入自己的临界区时,应立即让权等待当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入释放处理机,以免进程陷入“忙等忙等”状态 第二章 进 程 管 理 2.3.2 信号量机制 信号量机制    1.整型信号量.整型信号量    最最初初由由Dijkstra把把整整型型信信号号量量定定义义为为一一个个用用于于表表示示资资源源数数目目的的整整型型量量S,,它它与与一一般般整整型型量量不不同同,,除除初初始始化化外外,,仅仅能能通通过过两两个个标标准准的的原原子子操操作作(Atomic Operation) wait(S)和和signal(S)来来访访问问。

      很很长长时时间间以以来来,,这这两两个个操操作作一一直直被被分分别别称称为为P、、V操操作作Wait(S)和和signal(S)操作可描述为:操作可描述为:    wait(S):: while S<=0 do no-op;;                S:=S-1;;    signal(S)::S:=S+1;; 第二章 进 程 管 理     wait(S)和和signal(S)是两个原子操作,因此,它们在执行是两个原子操作,因此,它们在执行时是不可中断的时是不可中断的 亦即,当一个进程在修改某信号量时,没有其他进程可亦即,当一个进程在修改某信号量时,没有其他进程可同时对该信号量进行修改同时对该信号量进行修改 此外,在此外,在wait操作中,对操作中,对S值的测试和做值的测试和做S:=S-1操作时操作时都不可中断都不可中断 第二章 进 程 管 理     2.记录型信号量.记录型信号量  在整型信号量机制中的  在整型信号量机制中的wait操作,只要是信号量操作,只要是信号量S≤0,,就会不断地测试就会不断地测试 因此,该机制并未遵循因此,该机制并未遵循“让权等待让权等待”的准则,而是使进的准则,而是使进程处于程处于“忙等忙等”的状态。

      的状态 记录型信号量机制则是一种不存在记录型信号量机制则是一种不存在“忙等忙等”现象的进程现象的进程同步机制同步机制 第二章 进 程 管 理     但但在在采采取取了了“让让权权等等待待”的的策策略略后后,,又又会会出出现现多多个个进进程程等待访问同一临界资源的情况等待访问同一临界资源的情况 为为此此,,在在信信号号量量机机制制中中,,除除了了需需要要一一个个用用于于代代表表资资源源数数目目的的整整型型变变量量value外外,,还还应应增增加加一一个个进进程程链链表表指指针针L,,用用于于链接上述的所有等待进程链接上述的所有等待进程 记记录录型型信信号号量量是是由由于于它它采采用用了了记记录录型型的的数数据据结结构构而而得得名名的它所包含的上述两个数据项可描述为:的它所包含的上述两个数据项可描述为: 第二章 进 程 管 理 type semaphore=record              value: integer;;              L: list of process;;              end 第二章 进 程 管 理 相应地,相应地,wait(S)和和signal(S)操作可描述为:操作可描述为:procedure wait(S)          var S::semaphore;;          begin            S.value:=S.value-1;;            if S.value<0 then block(S.L);;          end procedure signal(S)          var S: semaphore;;          begin            S.value:=S.value+1;;            if S.value<=0 then wakeup(S.L);;          end 第二章 进 程 管 理   在记录型信号量机制中,  在记录型信号量机制中,S.value的初值表示系统中某类资的初值表示系统中某类资源的数目,因而又称为资源信号量。

      对它的每次源的数目,因而又称为资源信号量对它的每次wait操作,意操作,意味着进程请求一个单位的该类资源,使系统中可供分配的该类味着进程请求一个单位的该类资源,使系统中可供分配的该类资源数减少一个,因此描述为资源数减少一个,因此描述为S.value:=S.value-1;当;当S.value<0时,表示该类资源已分配完毕,因此进程应调用时,表示该类资源已分配完毕,因此进程应调用block原语,原语,进行自我阻塞,放弃处理机,并插入到信号量链表进行自我阻塞,放弃处理机,并插入到信号量链表S.L中可见,该机制遵循了见,该机制遵循了“让权等待让权等待”准则此时准则此时S.value的绝对值表的绝对值表示在该信号量链表中已阻塞进程的数目对信号量的每次示在该信号量链表中已阻塞进程的数目对信号量的每次signal操作,表示执行进程释放一个单位资源,使系统中可供操作,表示执行进程释放一个单位资源,使系统中可供分配的该类资源数增加一个,故分配的该类资源数增加一个,故S.value:=S.value+1操作表示资操作表示资源数目加源数目加1若加1后仍是后仍是S.value≤0,则表示在该信号量链表中,,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将原语,将S.L链表中的第一个等待进程唤醒。

      如果链表中的第一个等待进程唤醒如果S.value的初值为的初值为1,表,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量,用于进程互斥号量,用于进程互斥 第二章 进 程 管 理     3..AND型信号量型信号量  上述的进程互斥问题,是针对各进程之间只共享一个临  上述的进程互斥问题,是针对各进程之间只共享一个临界资源而言的在有些应用场合,是一个进程需要先获得两界资源而言的在有些应用场合,是一个进程需要先获得两个或更多的共享资源后方能执行其任务假定现有两个进程个或更多的共享资源后方能执行其任务假定现有两个进程A和和B,他们都要求访问共享数据,他们都要求访问共享数据D和和E当然,共享数据都当然,共享数据都应作为临界资源为此,可为这两个数据分别设置用于互斥应作为临界资源为此,可为这两个数据分别设置用于互斥的信号量的信号量Dmutex和和Emutex,并令它们的初值都是,并令它们的初值都是1相应地,相应地,在两个进程中都要包含两个对在两个进程中都要包含两个对Dmutex和和Emutex的操作,即的操作,即 process A:        process B:wait(Dmutex);  ;  wait(Emutex);;wait(Emutex);  ;  wait(Dmutex);; 第二章 进 程 管 理 若进程若进程A和和B按下述次序交替执行按下述次序交替执行wait操作:操作:    process A: wait(Dmutex);; 于是于是Dmutex=0    process B: wait(Emutex);; 于是于是Emutex=0    process A: wait(Emutex);; 于是于是Emutex=-1 A阻塞阻塞    process B: wait(Dmutex);; 于是于是Dmutex=-1 B阻塞阻塞   最后,进程  最后,进程A和和B处于僵持状态。

      在无外力作用下,两者处于僵持状态在无外力作用下,两者都将无法从僵持状态中解脱出来我们称此时的进程都将无法从僵持状态中解脱出来我们称此时的进程A和和B已已进入进入死锁状态死锁状态显然,当进程同时要求的共享资源愈多时,显然,当进程同时要求的共享资源愈多时,发生进程死锁的可能性也就愈大发生进程死锁的可能性也就愈大 第二章 进 程 管 理     AND同步机制的基本思想是:将进程在整个运行过程中同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放只要尚有一个资源未能分配给进程,其它所后再一起释放只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源也不分配给它有可能为之分配的资源也不分配给它 亦即,对若干个临界资源的分配,采取原子操作方式:亦即,对若干个临界资源的分配,采取原子操作方式:要么把它所请求的资源全部分配到进程,要么一个也不分配要么把它所请求的资源全部分配到进程,要么一个也不分配 由死锁理论可知,这样就可避免上述死锁情况的发生为由死锁理论可知,这样就可避免上述死锁情况的发生。

      为此,在此,在wait操作中,增加了一个操作中,增加了一个“AND”条件,故称为条件,故称为AND同步,或称为同时同步,或称为同时wait操作,即操作,即Swait(Simultaneous wait)定定义如下义如下: 第二章 进 程 管 理 Swait(S1,,S2,,…,,Sn)    if Si>=1 and … and Sn>=1 then      for i:=1 to n do       Si:=Si-1;;      endfor    else    place the process in the waiting queue associated with the first Si found with Si<1,,and set the program count of this process to the beginning of Swait operation     endifSsignal(S1,,S2,,…,,Sn)for i:=1 to n do    Si:=Si+1;;Remove all the process waiting in the queue associated with Si into the ready queue.endfor;; 第二章 进 程 管 理     4.信号量集.信号量集  在记录型信号量机制中,  在记录型信号量机制中,wait(S)或或signal(S)操作仅能对操作仅能对信号量施以加信号量施以加1或减或减1操作,意味着每次只能获得或释放一个操作,意味着每次只能获得或释放一个单位的临界资源。

      而当一次需要单位的临界资源而当一次需要N个某类临界资源时,便要个某类临界资源时,便要进行进行N次次wait(S)操作,显然这是低效的此外,在有些情况操作,显然这是低效的此外,在有些情况下,当资源数量低于某一下限值时,便不予以分配因而,下,当资源数量低于某一下限值时,便不予以分配因而,在每次分配之前,都必须测试该资源的数量,看其是否大于在每次分配之前,都必须测试该资源的数量,看其是否大于其下限值基于上述两点,可以对其下限值基于上述两点,可以对AND信号量机制加以扩充,信号量机制加以扩充,形成一般化的形成一般化的“信号量集信号量集”机制Swait操作可描述如下,其操作可描述如下,其中中S为信号量,为信号量,d为需求值,而为需求值,而t为下限值为下限值 第二章 进 程 管 理 Swait(S1,,t1,,d1,,…,,Sn,,tn,,dn)        if Si>=t1 and … and Sn>=tn then            for i:=1 to n do                Si:=Si-di;;        endfor      else      Place the executing process in the waiting queue of the first Si with Si

      此此时时在在信信号号量量集集中中只只有有一一个个信信号号量量S,,但但允允许许它它每每次次申申请请d个个资资源源,,当当现现有有资资源源数数少少于于d时时,,不不予分配    (2) Swait(S,,1,,1)此此时时的的信信号号量量集集已已蜕蜕化化为为一一般般的的记记录型信号量录型信号量(S>1时时)或互斥信号量或互斥信号量(S=1时时)    (3) Swait(S,,1,,0)这是一种很特殊且很有用的信号量这是一种很特殊且很有用的信号量操作当S≥1时,允许多个进程进入某特定区;当时,允许多个进程进入某特定区;当S变为变为0后,后,将阻止任何进程进入特定区换言之,它相当于一个可控开将阻止任何进程进入特定区换言之,它相当于一个可控开关    第二章 进 程 管 理 2.3.3 信号量的应用 信号量的应用    1.利用信号量实现进程互斥.利用信号量实现进程互斥  为使多个进程能互斥地访问某临界资源,只须为该资源  为使多个进程能互斥地访问某临界资源,只须为该资源设置一互斥信号量设置一互斥信号量mutex,并设其初始值为,并设其初始值为1,然后将各进程,然后将各进程访问该资源的临界区访问该资源的临界区CS置于置于wait(mutex)和和signal(mutex)操作操作之间即可。

      这样,每个欲访问该临界资源的进程在进入临界之间即可这样,每个欲访问该临界资源的进程在进入临界区之前,都要先对区之前,都要先对mutex执行执行wait操作,若该资源此刻未被访操作,若该资源此刻未被访问,本次问,本次wait操作必然成功,进程便可进入自己的临界区,操作必然成功,进程便可进入自己的临界区,这时若再有其他进程也欲进入自己的临界区,此时由于对这时若再有其他进程也欲进入自己的临界区,此时由于对mutex执行执行wait操作定会失败,因而该进程阻塞,从而保证了操作定会失败,因而该进程阻塞,从而保证了该临界资源能被互斥地访问当访问临界资源的进程退出临该临界资源能被互斥地访问当访问临界资源的进程退出临界区后,又应对界区后,又应对mutex执行执行signal操作,以便释放该临界资源操作,以便释放该临界资源利用信号量实现进程互斥的进程可描述如下:利用信号量实现进程互斥的进程可描述如下: 第二章 进 程 管 理 Var mutex: semaphore:=1;;    begin    parbegin        process 1: begin                       repeat                         wait(mutex);;                         critical section                         signal(mutex);;                         remainder seetion                       until false;;                     end 第二章 进 程 管 理 process 2: begin                 repeat                    wait(mutex);;                    critical section                    signal(mutex);;                    remainder section                  until false;;                end        parend 第二章 进 程 管 理     2.利用信号量实现前趋关系.利用信号量实现前趋关系     还还可可利利用用信信号号量量来来描描述述程程序序或或语语句句之之间间的的前前趋趋关关系系。

      设设有有两两个个并并发发执执行行的的进进程程P1和和P2P1中中有有语语句句S1;;P2中中有有语语句句S2我我们们希希望望在在S1执执行行后后再再执执行行S2为为实实现现这这种种前前趋趋关关系系,,我我们们只只须须使使进进程程P1和和P2共共享享一一个个公公用用信信号号量量S,,并并赋赋予予其其初初值值为为0,,将将signal(S)操操作作放放在在语语句句S1后后面面;;而而在在S2语语句句前前面面插插入入wait(S)操作,即操作,即  在进程  在进程P1中,用中,用S1;;signal(S);;  在进程  在进程P2中,用中,用wait(S);;S2;; 第二章 进 程 管 理   由于  由于S被初始化为被初始化为0,这样,若,这样,若P2先执行必定阻塞,只先执行必定阻塞,只有在进程有在进程P1执行完执行完S1;;signal(S);操作后使;操作后使S增为增为1时,时,P2进进程方能执行语句程方能执行语句S2成功同样,我们可以利用信号量,按照成功同样,我们可以利用信号量,按照语句间的前趋关系语句间的前趋关系(见图见图2-12),写出一个更为复杂的可并发,写出一个更为复杂的可并发执行的程序。

      执行的程序   图  图2-12示出了一个前趋图,其中示出了一个前趋图,其中S1,,S2,,S3,,…,,S6是是最简单的程序段最简单的程序段(只有一条语句只有一条语句)为使各程序段能正确执行,为使各程序段能正确执行,应设置若干个初始值为应设置若干个初始值为“0”的信号量如为保证的信号量如为保证S1→S2,,S1→S3的前趋关系,应分别设置信号量的前趋关系,应分别设置信号量a 和和b,同样,为了保,同样,为了保证证S2→S4,,S2→S5,,S3→S6,,S4→S6和和S5→S6,应设置信号量,应设置信号量c,,d,,e,,f,,g 第二章 进 程 管 理 Var a,b,c,d,e,f,g::semaphore: =0,0,0,0,0,0,0;;    begin      parbegin        begin S1;; signal(a);; signal(b);; end;;        begin wait(a);; S2;; signal(c);; signal(d);; end;;        begin wait(b);; S3;; signal(e);; end;;        begin wait(c);; S4;; signal(f);; end;;        begin wait(d);; S5;; signal(g);; end;;        begin wait(e);; wait(f);; wait(g);; S6;; end;;      parend    end 第二章 进 程 管 理 图2-12 前趋图举例 第二章 进 程 管 理 2.3.4 管程机制 管程机制    1.管程的定义.管程的定义  系统中的各种硬件资源和软件资源,均可用数据结构抽系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对该资源所执行的操象地描述其资源特性,即用少量信息和对该资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节。

      作来表征该资源,而忽略了它们的内部结构和实现细节 例如,对一台电传机,可用与分配该资源有关的状态信例如,对一台电传机,可用与分配该资源有关的状态信息息(busy或或free)和对它执行请求与释放的操作,以及等待该和对它执行请求与释放的操作,以及等待该资源的进程队列来描述又如,一个资源的进程队列来描述又如,一个FIFO队列,可用其队队列,可用其队长、队首和队尾以及在该队列上执行的一组操作来描述长、队首和队尾以及在该队列上执行的一组操作来描述 第二章 进 程 管 理   利用共享数据结构抽象地表示系统中的共享资源,而把  利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程,如资源的请对该共享数据结构实施的操作定义为一组过程,如资源的请求和释放过程求和释放过程request和和release 进程对共享资源的申请、释放和其它操作,都是通过这进程对共享资源的申请、释放和其它操作,都是通过这组过程对共享数据结构的操作来实现的,这组过程还可以根组过程对共享数据结构的操作来实现的,这组过程还可以根据资源的情况,或接受或阻塞进程的访问,确保每次仅有一据资源的情况,或接受或阻塞进程的访问,确保每次仅有一个进程使用共享资源,这样就可以统一管理对共享资源的所个进程使用共享资源,这样就可以统一管理对共享资源的所有访问,实现进程互斥。

      有访问,实现进程互斥 第二章 进 程 管 理     代代表表共共享享资资源源的的数数据据结结构构,,以以及及由由对对该该共共享享数数据据结结构构实实施施操操作作的的一一组组过过程程所所组组成成的的资资源源管管理理程程序序,,共共同同构构成成了了一个操作系统的资源管理模块,我们称之为一个操作系统的资源管理模块,我们称之为管程管程 管管程程被被请请求求和和释释放放资资源源的的进进程程所所调调用用Hansan为为管管程程所所下下的的定定义义是是::“一一个个管管程程定定义义了了一一个个数数据据结结构构和和能能为为并并发发进进程程所所执执行行(在在该该数数据据结结构构上上)的的一一组组操操作作,,这这组组操操作作能能同步进程和改变管程中的数据同步进程和改变管程中的数据” 第二章 进 程 管 理   由上述的定义可知,管程由四部分组成:  由上述的定义可知,管程由四部分组成:①① 管程的名称;管程的名称;②② 局部于管程内部的共享数据结构说明;局部于管程内部的共享数据结构说明;③③ 对该数据结构进行操作的一组过程;对该数据结构进行操作的一组过程;④④ 对局部于管程内部的共享数据设置初始值的语句。

      对局部于管程内部的共享数据设置初始值的语句 图图2-13是一个管程的示意图是一个管程的示意图 第二章 进 程 管 理 图2-13 管程的示意图 第二章 进 程 管 理 管程的语法描述如下:管程的语法描述如下:    type monitor_name = MONITOR;;<共享变量说明共享变量说明>;;define <(能被其他模块引用的能被其他模块引用的)过程名列表过程名列表>;;use <(要调用的本模块外定义的要调用的本模块外定义的)过程名列表过程名列表>;;procedure <过程名过程名>(<形式参数表形式参数表>);;begin end; …… 第二章 进 程 管 理 function <函数名函数名>(<形式参数表形式参数表>):值类型;:值类型;begin end;; begin <管程的局部数据初始化语句序列管程的局部数据初始化语句序列>;;end …… 第二章 进 程 管 理     需需要要指指出出的的是是,,局局部部于于管管程程内内部部的的数数据据结结构构,,仅仅能能被被局局部部于于管管程程内内部部的的过过程程所所访访问问,,任任何何管管程程外外的的过过程程都都不不能能访访问问它它;;反反之之,,局局部部于于管管程程内内部部的的过过程程也也仅仅能能访访问问管管程程内内的数据结构。

      的数据结构 由由此此可可见见,,管管程程相相当当于于围围墙墙,,它它把把共共享享变变量量和和对对它它进进行行操操作作的的若若干干过过程程围围了了起起来来,,所所有有进进程程要要访访问问临临界界资资源源时时,,都都必必须须经经过过管管程程(相相当当于于通通过过围围墙墙的的门门)才才能能进进入入,,而而管管程程每每次只准许一个进程进入管程,从而实现了进程互斥次只准许一个进程进入管程,从而实现了进程互斥  管程是一种程序设计语言结构成分,它和信号量有同  管程是一种程序设计语言结构成分,它和信号量有同等的表达能力,从语言的角度看,管程主要有以下特性:等的表达能力,从语言的角度看,管程主要有以下特性: 第二章 进 程 管 理     (1) 模块化管程是一个基本程序单位,可以单独编译管程是一个基本程序单位,可以单独编译    (2) 抽象数据类型管程中不仅有数据,而且有对数据抽象数据类型管程中不仅有数据,而且有对数据的操作    (3) 信息掩蔽管程中的数据结构只能被管程中的过程信息掩蔽管程中的数据结构只能被管程中的过程访问,这些过程也是在管程内部定义的,供管程外的进程访问,这些过程也是在管程内部定义的,供管程外的进程调用,而管程中的数据结构以及过程调用,而管程中的数据结构以及过程(函数函数)的具体实现外部的具体实现外部不可见。

      不可见 第二章 进 程 管 理   管程和进程不同,主要体现在以下几个方面:  管程和进程不同,主要体现在以下几个方面:    (1) 虽虽然然二二者者都都定定义义了了数数据据结结构构,,但但进进程程定定义义的的是是私私有有数据结构数据结构PCB,管程定义的是公共数据结构,管程定义的是公共数据结构,如消息队列等;,如消息队列等;    (2) 二二者者都都存存在在对对各各自自数数据据结结构构上上的的操操作作,,但但进进程程是是由由顺顺序序程程序序执执行行有有关关的的操操作作,,而而管管程程主主要要是是进进行行同同步步操操作作和和初初始化操作始化操作;;    (3) 设置进程的目的在于实现系统的并发性,而管程的设置进程的目的在于实现系统的并发性,而管程的设置则是解决共享资源的互斥使用问题;设置则是解决共享资源的互斥使用问题;    第二章 进 程 管 理     (4) 进进程程通通过过调调用用管管程程中中的的过过程程对对共共享享数数据据结结构构实实行行操操作作,,该该过过程程就就如如通通常常的的子子程程序序一一样样被被调调用用,,因因而而管管程程为为被被动动工工作作方式,进程则为主动工作方式;方式,进程则为主动工作方式;    (5) 进程之间能并发执行,而管程则不能与其调用者并发;进程之间能并发执行,而管程则不能与其调用者并发;    (6) 进程具有动态性,由进程具有动态性,由“创建创建”而诞生,由而诞生,由“撤销撤销”而而消亡,而管程则是操作系统中的一个资源管理模块,供进程消亡,而管程则是操作系统中的一个资源管理模块,供进程调用。

      调用 第二章 进 程 管 理     2.条件变量.条件变量  在利用管程实现进程同步时,必须设置同步工具,如  在利用管程实现进程同步时,必须设置同步工具,如两个同步操作原语两个同步操作原语wait和和signal 当某进程通过管程请求获得临界资源而未能满足时,当某进程通过管程请求获得临界资源而未能满足时,管程便调用管程便调用wait原语使该进程等待原语使该进程等待,并将其排在等待队列,并将其排在等待队列上,如图上,如图2-13 所示仅当另一进程访问完成并释放该资源仅当另一进程访问完成并释放该资源之后,管程才又调用之后,管程才又调用signal原语原语,唤醒等待队列中的队首进,唤醒等待队列中的队首进程   第二章 进 程 管 理   但是仅仅有上述的同步工具是不够的考虑一种情况:  但是仅仅有上述的同步工具是不够的考虑一种情况:当一个进程调用了管程,在管程中时被阻塞或挂起,直到阻当一个进程调用了管程,在管程中时被阻塞或挂起,直到阻塞或挂起的原因解除,而在此期间,塞或挂起的原因解除,而在此期间,如果该进程不释放管程,如果该进程不释放管程,则其它进程无法进入管程,被迫长时间地等待则其它进程无法进入管程,被迫长时间地等待。

      为了解决这个问题,引入了条件变量为了解决这个问题,引入了条件变量condition通常,一个进程被阻塞或挂起的条件一个进程被阻塞或挂起的条件(原因原因)可有多个,因此在管程可有多个,因此在管程中设置了多个条件变量中设置了多个条件变量,对这些条件变量的访问,只能在管,对这些条件变量的访问,只能在管程中进行程中进行 第二章 进 程 管 理     管管程程中中对对每每个个条条件件变变量量都都须须予予以以说说明明,,其其形形式式为为::Var x,,y::condition 对对条条件件变变量量的的操操作作仅仅仅仅是是wait和和signal,,因因此此条条件件变变量量也也是是一一种种抽抽象象数数据据类类型型,,每每个个条条件件变变量量保保存存了了一一个个链链表表,,用用于于记记录录因因该该条条件件变变量量而而阻阻塞塞的的所所有有进进程程,,同同时时提提供供的的两两个个操操作作即可表示为即可表示为x.wait和和x.signal,,其含义为:其含义为:    ①① x.wait:正在调用管程的进程因:正在调用管程的进程因x条件需要被阻塞或条件需要被阻塞或挂起,则调用挂起,则调用x.wait将自己插入到将自己插入到x条件的等待队列上,并释条件的等待队列上,并释放管程,直到放管程,直到x条件变化。

      此时其它进程可以使用该管程条件变化此时其它进程可以使用该管程 第二章 进 程 管 理     ②② x.signal::正正在在调调用用管管程程的的进进程程发发现现x条条件件发发生生了了变变化化,,则则调调用用x.signal,,重重新新启启动动一一个个因因x条条件件而而阻阻塞塞或或挂挂起起的的进进程程如如果果存存在在多多个个这这样样的的进进程程,,则则选选择择其其中中的的一一个个,,如如果果没没有有,,则则继继续续执执行行原原进进程程,,而而不不产产生生任任何何结结果果这这与与信信号号量量机机制制中中的的signal操操作作不不同同,,因因为为后后者者总总是是要要执执行行s:=s+1操操作作,,因因而而总总会改变信号量的状态会改变信号量的状态    如如果果有有进进程程Q因因x条条件件处处于于阻阻塞塞状状态态,,当当正正在在调调用用管管程程的的进进程程P执执行行了了x.signal操操作作后后,,进进程程Q被被重重新新启启动动,,此此时时两两个个进进程程P和和Q,,如如何何确确定定哪哪个个执执行行,,哪哪个个等等待待,,可可采采用用下下述述两两种种方方式之一进行处理:式之一进行处理:(1) P等待,直至等待,直至Q离开管程或等待另一条件。

      离开管程或等待另一条件2) Q等待,直至等待,直至P离开管程或等待另一条件离开管程或等待另一条件 第二章 进 程 管 理   采用哪种处理方式,当然是各执一词  采用哪种处理方式,当然是各执一词 Hoare采用了第一种处理方式,而采用了第一种处理方式,而Hansan选择了两者的选择了两者的折衷,他规定管程中的过程所执行的折衷,他规定管程中的过程所执行的signal 操作是过程体的操作是过程体的最后一个操作,于是,进程最后一个操作,于是,进程P执行执行signal操作后立即退出管程,操作后立即退出管程,因而进程因而进程Q马上被恢复执行马上被恢复执行 第二章 进 程 管 理 2.4 经典进程的同步问题 经典进程的同步问题 2.4.1 生产者 生产者—消费者问题消费者问题    1.利用记录型信号量解决生产者.利用记录型信号量解决生产者—消费者问题消费者问题  假定在生产者和消费者之间的公用缓冲池中,具有  假定在生产者和消费者之间的公用缓冲池中,具有n个缓个缓冲区,这时可利用互斥信号量冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互实现诸进程对缓冲池的互斥使用。

      利用信号量斥使用利用信号量empty和和full分别表示缓冲池中空缓冲区分别表示缓冲池中空缓冲区和满缓冲区的数量又假定这些生产者和消费者相互等效,和满缓冲区的数量又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息对生产者池未空,消费者便可从缓冲池中取走一个消息对生产者—消费者问题可描述如下消费者问题可描述如下: 第二章 进 程 管 理 Var mutex,,empty,,full: semaphore:=1,n,0;;    buffer:array[0,,…,,n-1] of item;;    in,,out: integer:=0,,0;;    begin      parbegin      proceducer: begin                  repeat                                            producer an item nextp;;                                            wait(empty);; …… 第二章 进 程 管 理 wait(mutex);;                  buffer(in):=nextp;;                  in:=(in+1) mod n;;                  signal(mutex);;                  signal(full);;                  until false;;              end      consumer: begin                repeat                    wait(full);;                    wait(mutex);;                    nextc:=buffer(out);; 第二章 进 程 管 理 out:=(out+1) mod n;;                        signal(mutex);;                        signal(empty);;                        consumer the item in nextc;;                      until false;;                    end        parend    end 第二章 进 程 管 理 在生产者在生产者—消费者问题中应注意:首先,在每个程序中消费者问题中应注意:首先,在每个程序中用于实现互斥的用于实现互斥的wait(mutex)和和signal(mutex)必须成对地出现;必须成对地出现;其次,对资源信号量其次,对资源信号量empty和和full的的wait和和signal操作,同样操作,同样需要成对地出现,但它们分别处于不同的程序中。

      例如,需要成对地出现,但它们分别处于不同的程序中例如,wait(empty)在计算进程中,而在计算进程中,而signal(empty)则在打印进程中,则在打印进程中,计算进程若因执行计算进程若因执行wait(empty)而阻塞,则以后将由打印进而阻塞,则以后将由打印进程将它唤醒;最后,在每个程序中的多个程将它唤醒;最后,在每个程序中的多个wait操作顺序不能操作顺序不能颠倒,应先执行对资源信号量的颠倒,应先执行对资源信号量的wait操作,然后再执行对互操作,然后再执行对互斥信号量的斥信号量的wait操作,否则可能引起进程死锁操作,否则可能引起进程死锁 第二章 进 程 管 理     2.利用.利用AND信号量解决生产者信号量解决生产者—消费者问题消费者问题    对对于于生生产产者者—消消费费者者问问题题,,也也可可利利用用AND信信号号量量来来解解决决,,即即用用Swait(empty,,mutex)来来代代替替wait(empty)和和wait(mutex);;用用Ssignal(mutex,,full)来来代代替替signal(mutex)和和signal(full);;用用Swait(full,,mutex)来来代代替替wait(full)和和wait(mutex),,以以及及用用Ssignal(mutex,,empty)代代替替Signal(mutex)和和Signal(empty)。

      利用利用AND信号量来解决生产者信号量来解决生产者—消费者问题的算法描述如下:消费者问题的算法描述如下: 第二章 进 程 管 理 Var mutex,,empty,,full: semaphore:=1,,n,,0;;      buffer:array[0,,…,,n-1] of item;;      in out: integer:=0,,0;;    begin      parbegin          producer: begin                        repeat                                                  produce an item in nextp;;                                                  Swait(empty,,mutex);;                        buffer(in):=nextp;;                        in:=(in+1)mod n;;                        Ssignal(mutex,,full);;                      until false;;                  end …… 第二章 进 程 管 理 consumer:begin                    repeat                      Swait(full,,mutex);;                      Nextc:=buffer(out);;                      Out:=(out+1) mod n;;                      Ssignal(mutex,,empty);;                      consumer the item in nextc;;                  until false;;              end          parend    end 第二章 进 程 管 理     3.利用管程解决生产者.利用管程解决生产者—消费者问题消费者问题    在在利利用用管管程程方方法法来来解解决决生生产产者者—消消费费者者问问题题时时,,首首先先便便是是为为它它们们建建立立一一个个管管程程,,并并命命名名为为ProclucerConsumer,,或或简简称称为为PC。

      其中包括两个过程:其中包括两个过程:    (1) put(item)过过程程生生产产者者利利用用该该过过程程将将自自己己生生产产的的产产品品投投放放到到缓缓冲冲池池中中,,并并用用整整型型变变量量count来来表表示示在在缓缓冲冲池池中中已已有有的产品数目,当的产品数目,当count≥n时,表示缓冲池已满,生产者须等待时,表示缓冲池已满,生产者须等待    (2) get(item)过程消费者利用该过程从缓冲池中取出一过程消费者利用该过程从缓冲池中取出一个产品,当个产品,当count≤0时,表示缓冲池中已无可取用的产品,消时,表示缓冲池中已无可取用的产品,消费者应等待费者应等待 第二章 进 程 管 理 PC管程可描述如下:管程可描述如下:    type producer-consumer=monitor        Var in,out,count: integer;;          buffer: array[0, …, n-1] of item;;          notfull,,notempty:condition;;//nutfull:用于描述生产者;用于描述生产者;//notempty:用于描述消费者;用于描述消费者; 第二章 进 程 管 理           procedure entry put(nextp)              begin                if count>=n then notfull.wait;;                  buffer(in):=nextp;;                  in:=(in+1) mod n;;                  count:=count+1;;                  if notempty.queue then notempty.signal;;                end 第二章 进 程 管 理         procedure entry get(nextc)              begin                if count<=0 then notempty.wait;;                nextc:=buffer(out);;                out:=(out+1) mod n;;                count:=count-1;;                if notfull.quene then notfull.signal;;              end        begin in:=out:=0;; count:=0 end 第二章 进 程 管 理 因此可以有以下说明:因此可以有以下说明:Var PC:producer-consumer 第二章 进 程 管 理     在在利利用用管管程程解解决决生生产产者者—消消费费者者问问题题时时,,其其中中的的生生产产者者和消费者可描述为:和消费者可描述为:    producer: begin                repeat                  produce an item in nextp;;                  PC.put(nextp);;                until false;;              end    consumer: begin                repeat                  PC.get(nextc);;                  consume the item in nextc;;                until false;;              end 第二章 进 程 管 理 2.4.2 哲学家进餐问题 哲学家进餐问题    1.利用记录型信号量解决哲学家进餐问题.利用记录型信号量解决哲学家进餐问题  经分析可知,放在桌子上的筷子是临界资源,在一段时  经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用。

      为了实现对筷子的互斥使用,间内只允许一位哲学家使用为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组其描述如下:量数组其描述如下:     Var chopstick: array[0,,…,,4] of semaphore;; 第二章 进 程 管 理 所有信号量均被初始化为所有信号量均被初始化为1,第,第i位哲学家的活动可描述为:位哲学家的活动可描述为:    repeat        wait(chopstick[i]);;        wait(chopstick[(i+1)mod 5]);;                    eat;;                    signal(chopstick[i]);;        signal(chopstick[(i+1)mod 5]);;                    think;;    until false;; ……… 第二章 进 程 管 理 在以上描述中,当哲学家饥饿时,总是先去拿他左边的在以上描述中,当哲学家饥饿时,总是先去拿他左边的筷子,即执行筷子,即执行wait(chopstick[i]);; 成功后,再去拿他右边的成功后,再去拿他右边的筷子,即执行筷子,即执行wait(chopstick[(i+1)mod 5]);又成功后便可进;又成功后便可进餐。

      进餐完毕,又先放下他左边的筷子,然后再放右边的筷餐进餐完毕,又先放下他左边的筷子,然后再放右边的筷子虽然,上述解法可保证不会有两个相邻的哲学家同时进子虽然,上述解法可保证不会有两个相邻的哲学家同时进餐,但餐,但有可能引起死锁有可能引起死锁假如五位哲学家同时饥饿而各自拿假如五位哲学家同时饥饿而各自拿起左边的筷子时,就会使五个信号量起左边的筷子时,就会使五个信号量chopstick均为均为0;; 当他当他们再试图去拿右边的筷子时,都将因无筷子可拿而无限期地们再试图去拿右边的筷子时,都将因无筷子可拿而无限期地等待对于这样的死锁问题,可采取以下几种解决方法:等待对于这样的死锁问题,可采取以下几种解决方法: 第二章 进 程 管 理     (1) 至至多多只只允允许许有有四四位位哲哲学学家家同同时时去去拿拿左左边边的的筷筷子子,,最最终终能能保保证证至至少少有有一一位位哲哲学学家家能能够够进进餐餐,,并并在在用用毕毕时时能能释释放放出出他他用过的两只筷子,从而使更多的哲学家能够进餐用过的两只筷子,从而使更多的哲学家能够进餐    (2) 仅仅当当哲哲学学家家的的左左、、右右两两只只筷筷子子均均可可用用时时,,才才允允许许他他拿拿起筷子进餐。

      起筷子进餐    (3) 规定奇数号哲学家先拿他左边的筷子,然后再去拿右规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子,而偶数号哲学家则相反按此规定,将是边的筷子,而偶数号哲学家则相反按此规定,将是1、、2号号哲学家竞争哲学家竞争1号筷子;号筷子;3、、4号哲学家竞争号哲学家竞争3号筷子即五位哲号筷子即五位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能获得两只筷子而进餐最后总会有一位哲学家能获得两只筷子而进餐 第二章 进 程 管 理     2.利用.利用AND信号量机制解决哲学家进餐问题信号量机制解决哲学家进餐问题  在哲学家进餐问题中,要求每个哲学家先获得两个临界  在哲学家进餐问题中,要求每个哲学家先获得两个临界资源资源(筷子筷子)后方能进餐,这在本质上就是前面所介绍的后方能进餐,这在本质上就是前面所介绍的AND同步问题,故用同步问题,故用AND信号量机制可获得最简洁的解法描述信号量机制可获得最简洁的解法描述如下:如下: Var chopsiick array of semaphore:=(1,1,1,1,1);;    processi      repeat          think;;          Sswait(chopstick[(i+1)mod 5],,chopstick[i]);;          eat;;          Ssignat(chopstick[(i+1)mod 5],,chopstick[i]);;      until false;; 第二章 进 程 管 理 2.4.3 读者 读者—写者问题写者问题    1.利用记录型信号量解决读者.利用记录型信号量解决读者—写者问题写者问题  为实现  为实现Reader与与Writer进程间在读或写时的互斥而设置进程间在读或写时的互斥而设置了一个互斥信号量了一个互斥信号量Wmutex。

      另外,再设置一个整型变量另外,再设置一个整型变量Readcount表示正在读的进程数目由于只要有一个表示正在读的进程数目由于只要有一个Reader进程在读,便不允许进程在读,便不允许Writer进程去写因此,仅当进程去写因此,仅当Readcount=0,表示尚无,表示尚无Reader进程在读时,进程在读时,Reader进程才进程才需要执行需要执行Wait(Wmutex)操作若Wait(Wmutex)操作成功,操作成功,Reader进程便可去读,相应地,做进程便可去读,相应地,做Readcount+1操作同理,操作同理,仅当仅当Reader进程在执行了进程在执行了Readcount减减1操作后其值为操作后其值为0时,时,才须执行才须执行signal(Wmutex)操作,以便让操作,以便让Writer进程写又因进程写又因为为Readcount是一个可被多个是一个可被多个Reader进程访问的临界资源,进程访问的临界资源,因此,也应该为它设置一个互斥信号量因此,也应该为它设置一个互斥信号量rmutex 第二章 进 程 管 理 读者读者—写者问题可描述如下写者问题可描述如下:    Var rmutex,,wmutex: semaphore:=1,1;;        Readcount: integer:=0;;        begin        parbegin          Reader: begin                repeat                  wait(rmutex);;                  if readcount=0 then wait(wmutex);;                    Readcount:=Readcount+1;;                  signal(rmutex);; 第二章 进 程 管 理                    perform read operation;;                                        wait(rmutex);;                  readcount:=readcount-1;;                  if readcount=0 then signal(wmutex);;                  signal(rmutex);;                until false;;              end        writer: begin                repeat                  wait(wmutex);;                  perform write operation;;                  signal(wmutex);;                until false;;              end        parend    end …… 第二章 进 程 管 理     2.利用信号量集机制解决读者.利用信号量集机制解决读者—写者问题写者问题  这里的读者  这里的读者—写者问题与前面的略有不同,它增加了一写者问题与前面的略有不同,它增加了一个限制,即最多只允许个限制,即最多只允许RN个读者同时读。

      个读者同时读 为此,又引入了一个信号量为此,又引入了一个信号量L,并赋予其初值为,并赋予其初值为RN,通,通过执行过执行wait(L,,1,,1)操作,来控制读者的数目操作,来控制读者的数目 每当有一个读者进入时,就要先执行每当有一个读者进入时,就要先执行wait(L,,1,,1)操作,操作,使使L的值减的值减1当有RN个读者进入读后,个读者进入读后,L便减为便减为0,第,第RN+1个读者要进入读时,必然会因个读者要进入读时,必然会因wait(L,,1,,1)操作失败而阻塞操作失败而阻塞对利用信号量集来解决读者对利用信号量集来解决读者—写者问题的描述如下:写者问题的描述如下: 第二章 进 程 管 理 Var RN integer;;        L,,mx: semaphore:=RN,1;;      begin        parbegin          reader: begin                repeat                  Swait(L,1,1);;                  Swait(mx,1,0);;                                        perform read operation;;                                        Ssignal(L,1);;                until false;;              end …… 第二章 进 程 管 理 writer: begin                  repeat                    Swait(mx,1,1;;L,RN,0);;                    perform write operation;;                    Ssignal(mx,1);;                until false;;              end        parend    end 第二章 进 程 管 理 其中,其中,Swait(mx,,1,,0)语句起着开关的作用。

      只要无语句起着开关的作用只要无writer进程进入写,进程进入写,mx=1,,reader进程就都可以进入读但只要一进程就都可以进入读但只要一旦有旦有writer进程进入写时,其进程进入写时,其mx=0,则任何,则任何reader进程就都进程就都无法进入读无法进入读Swait(mx,,1,,1;;L,,RN,,0)语句表示仅当既语句表示仅当既无无writer进程在写进程在写(mx=1),又无,又无reader进程在读进程在读(L=RN)时,时,writer进程才能进入临界区写进程才能进入临界区写 第二章 进 程 管 理 2.5 进进 程程 通通 信信 2.5.1 进程通信的类型 进程通信的类型    1.共享存储器系统.共享存储器系统   (1) 基于共享数据结构的通信方式基于共享数据结构的通信方式 在这种通信方式中,在这种通信方式中,要求诸进程公用某些数据结构要求诸进程公用某些数据结构,借,借以实现诸进程间的信息交换以实现诸进程间的信息交换 第二章 进 程 管 理 如如在在生生产产者者—消消费费者者问问题题中中,,就就是是用用有有界界缓缓冲冲区区这这种种数数据结构来实现通信的。

      据结构来实现通信的 这这里里,,公公用用数数据据结结构构的的设设置置及及对对进进程程间间同同步步的的处处理理,,都都是程序员的职责是程序员的职责 这这无无疑疑增增加加了了程程序序员员的的负负担担,,而而操操作作系系统统却却只只须须提提供供共共享享存存储储器器因因此此,,这这种种通通信信方方式式是是低低效效的的,,只只适适于于传传递递相相对对少量的数据少量的数据 第二章 进 程 管 理     (2) 基于共享存储区的通信方式基于共享存储区的通信方式 为了传输大量数据,在存储器中划出了一块共享存储区,为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信这诸进程可通过对共享存储区中数据的读或写来实现通信这种通信方式属于高级通信种通信方式属于高级通信 进程在通信前,先向系统申请获得共享存储区中的一个进程在通信前,先向系统申请获得共享存储区中的一个分区,并指定该分区的关键字;若系统已经给其他进程分配分区,并指定该分区的关键字;若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者,继之,了这样的分区,则将该分区的描述符返回给申请者,继之,由申请者把获得的共享存储分区连接到本进程上;此后,便由申请者把获得的共享存储分区连接到本进程上;此后,便可像读、写普通存储器一样地读、写该公用存储分区。

      可像读、写普通存储器一样地读、写该公用存储分区 第二章 进 程 管 理     2.消息传递系统.消息传递系统  消息传递系统  消息传递系统(Message passing system)是当前应用最为是当前应用最为广泛的一种进程间的通信机制广泛的一种进程间的通信机制 在该机制中,进程间的数据交换是以格式化的消息在该机制中,进程间的数据交换是以格式化的消息(message)为单位的;在计算机网络中,又把为单位的;在计算机网络中,又把message称为称为报报文文 程序员直接利用操作系统提供的一组通信命令程序员直接利用操作系统提供的一组通信命令(原语原语),不,不仅能实现大量数据的传递,而且还隐藏了通信的实现细节,仅能实现大量数据的传递,而且还隐藏了通信的实现细节,使通信过程对用户是透明的,从而大大减化了通信程序编制使通信过程对用户是透明的,从而大大减化了通信程序编制的复杂性,因而获得了广泛的应用的复杂性,因而获得了广泛的应用 第二章 进 程 管 理   特别值得一提的是,在当今最为流行的微内核操作系统  特别值得一提的是,在当今最为流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地都采用了消息中,微内核与服务器之间的通信,无一例外地都采用了消息传递机制。

      传递机制 又由于它能很好地支持多处理机系统、分布式系统和计又由于它能很好地支持多处理机系统、分布式系统和计算机网络,因此它也成为这些领域最主要的通信工具算机网络,因此它也成为这些领域最主要的通信工具 消息传递系统的通信方式属于高级通信方式又因其实消息传递系统的通信方式属于高级通信方式又因其实现方式的不同而进一步分成现方式的不同而进一步分成直接通信方式直接通信方式和和间接通信方式间接通信方式两两种 第二章 进 程 管 理     3.管道通信.管道通信  所谓  所谓“管道管道”,是指用于连接一个读进程和一个写进程,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名以实现它们之间通信的一个共享文件,又名pipe文件 向管道向管道(共享文件共享文件)提供输入的提供输入的发送进程发送进程(即写进程即写进程),以字,以字符流形式将大量的数据送入管道;而接受管道输出的符流形式将大量的数据送入管道;而接受管道输出的接收进接收进程程(即读进程即读进程),则从管道中接收,则从管道中接收(读读)数据 由于发送进程和接收进程是利用管道进行通信的,故又由于发送进程和接收进程是利用管道进行通信的,故又称为称为管道通信管道通信。

      这种方式首创于这种方式首创于UNIX系统,由于它能有效地传送大量数系统,由于它能有效地传送大量数据,因而又被引入到许多其它的操作系统中据,因而又被引入到许多其它的操作系统中 第二章 进 程 管 理     为为了了协协调调双双方方的的通通信信,,管管道道机机制制必必须须提提供供以以下下三三方方面面的的协调能力:协调能力:    (1) 互互斥斥,,即即当当一一个个进进程程正正在在对对pipe执执行行读读/写写操操作作时时,,其它其它(另一另一)进程必须等待进程必须等待    (2) 同同步步,,指指当当写写(输输入入)进进程程把把一一定定数数量量(如如4 KB)的的数数据据写写入入pipe,,便便去去睡睡眠眠等等待待,,直直到到读读(输输出出)进进程程取取走走数数据据后后,,再再把把它它唤唤醒醒当当读读进进程程读读一一空空pipe时时,,也也应应睡睡眠眠等等待待,,直直至至写进程将数据写入管道后,才将之唤醒写进程将数据写入管道后,才将之唤醒    (3) 确定对方是否存在,只有确定了对方已存在时,才确定对方是否存在,只有确定了对方已存在时,才能进行通信能进行通信 第二章 进 程 管 理 2.5.2 消息传递通信的实现方法 消息传递通信的实现方法    1.直接通信方式.直接通信方式    这这是是指指发发送送进进程程利利用用OS所所提提供供的的发发送送命命令令,,直直接接把把消消息息发发送送给给目目标标进进程程。

      此此时时,,要要求求发发送送进进程程和和接接收收进进程程都都以以显显式式方式提供对方的标识符通常,系统提供下述两条通信命令方式提供对方的标识符通常,系统提供下述两条通信命令(原语原语)::Send(Receiver,,message);; 发送一个消息给接收进程;发送一个消息给接收进程;Receive(Sender,,message);; 接收接收Sender发来的消息;发来的消息;  例如,原语  例如,原语Send(P2,,m1)表示将消息表示将消息m1发送给接收进程发送给接收进程P2;而原语;而原语Receive(P1,,m1)则表示接收由则表示接收由P1发来的消息发来的消息m1 第二章 进 程 管 理     在在某某些些情情况况下下,,接接收收进进程程可可与与多多个个发发送送进进程程通通信信,,因因此此,,它不可能事先指定发送进程它不可能事先指定发送进程 例例如如,,用用于于提提供供打打印印服服务务的的进进程程,,它它可可以以接接收收来来自自任任何何一个进程的一个进程的“打印请求打印请求”消息 对对于于这这样样的的应应用用,,在在接接收收进进程程接接收收消消息息的的原原语语中中,,表表示示源源进进程程的的参参数数,,也也是是完完成成通通信信后后的的返返回回值值,,接接收收原原语语可可表表示示为:为:    Receive (id,,message);; 第二章 进 程 管 理   我们还可以利用直接通信原语来解决生产者  我们还可以利用直接通信原语来解决生产者—消费者消费者问题。

      问题 当生产者生产出一个产品当生产者生产出一个产品(消息消息)后,便用后,便用Send原语将消原语将消息发送给消费者进程;而消费者进程则利用息发送给消费者进程;而消费者进程则利用Receive原语来原语来得到一个消息得到一个消息 如果消息尚未生产出来,消费者必须等待,直至生产如果消息尚未生产出来,消费者必须等待,直至生产者进程将消息发送过来者进程将消息发送过来 生产者生产者—消费者的通信过程可分别描述如下:消费者的通信过程可分别描述如下: 第二章 进 程 管 理 repeat                    produce an item in nextp;;                    send(consumer,,nextp);;until false;;repeat        receive(producer,,nextc);;                    consume the item in nextc;;until false;; ……… 第二章 进 程 管 理     2.间接通信方式.间接通信方式    间间接接通通信信方方式式指指进进程程之之间间的的通通信信需需要要通通过过作作为为共共享享数数据据结结构构的的实实体体。

      该该实实体体用用来来暂暂存存发发送送进进程程发发送送给给目目标标进进程程的的消消息息;;接接收收进进程程则则从从该该实实体体中中取取出出对对方方发发送送给给自自己己的的消消息息通通常常把把这这种种中中间间实实体体称称为为信信箱箱消消息息在在信信箱箱中中可可以以安安全全地地保保存存,,只只允允许许核核准准的的目目标标用用户户随随时时读读取取因因此此,,利利用用信信箱箱通通信信方方式式,,既可实现实时通信,又可实现非实时通信既可实现实时通信,又可实现非实时通信    系系统统为为信信箱箱通通信信提提供供了了若若干干条条原原语语,,分分别别用用于于信信箱箱的的创创建、撤消和消息的发送、接收等建、撤消和消息的发送、接收等 第二章 进 程 管 理     (1) 信箱的创建和撤消信箱的创建和撤消 进程可利用信箱创建原语来建立一个新信箱创建者进程可利用信箱创建原语来建立一个新信箱创建者进程应给出信箱名字、信箱属性进程应给出信箱名字、信箱属性(公用、私用或共享公用、私用或共享);对于;对于共享信箱,还应给出共享者的名字当进程不再需要读信箱共享信箱,还应给出共享者的名字当进程不再需要读信箱时,可用信箱撤消原语将之撤消。

      时,可用信箱撤消原语将之撤消 第二章 进 程 管 理     (2) 消消息息的的发发送送和和接接收收当当进进程程之之间间要要利利用用信信箱箱进进行行通通信信时时,,必必须须使使用用共共享享信信箱箱,,并并利利用用系系统统提提供供的的下下述述通通信信原原语语进进行通信:行通信:    Send(mailbox,,message);; 将一个消息发送到指定信箱;将一个消息发送到指定信箱;    Receive(mailbox,,message);; 从从指指定定信信箱箱中中接接收收一一个个消消息;息;  信箱可由操作系统创建,也可由用户进程创建,创建者  信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者据此,可把信箱分为以下三类是信箱的拥有者据此,可把信箱分为以下三类 第二章 进 程 管 理     1) 私用信箱私用信箱    用用户户进进程程可可为为自自己己建建立立一一个个新新信信箱箱,,并并作作为为该该进进程程的的一一部部分分信信箱箱的的拥拥有有者者有有权权从从信信箱箱中中读读取取消消息息,,其其他他用用户户则则只只能能将将自自己己构构成成的的消消息息发发送送到到该该信信箱箱中中。

      这这种种私私用用信信箱箱可可采采用用单单向向通通信信链链路路的的信信箱箱来来实实现现当当拥拥有有该该信信箱箱的的进进程程结结束束时时,,信箱也随之消失信箱也随之消失    2) 公用信箱公用信箱  它  它由操作系统创建由操作系统创建,并提供给系统中的所有核准进程使,并提供给系统中的所有核准进程使用核准进程既可把消息发送到该信箱中,也可从信箱中读用核准进程既可把消息发送到该信箱中,也可从信箱中读取发送给自己的消息显然,公用信箱应取发送给自己的消息显然,公用信箱应采用双向通信链路采用双向通信链路的信箱来实现通常,公用信箱在系统运行期间始终存在的信箱来实现通常,公用信箱在系统运行期间始终存在 第二章 进 程 管 理     3) 共享信箱共享信箱    它它由由某某个个进进程程创创建建,,在在创创建建时时或或创创建建后后指指明明它它是是共共享享的的,,同同时时须须指指出出共共享享进进程程((用用户户))的的名名字字信信箱箱的的拥拥有有者者和和共共享享者都有权从信箱中取走发送给自己的消息者都有权从信箱中取走发送给自己的消息 在在利利用用信信箱箱进进行行通通信信时时,,发发送送进进程程和和接接受受进进程程之之间间存存在在以下四种关系:以下四种关系: (1) 一一对对一一关关系系。

      此此时时为为发发送送进进程程和和接接受受进进程程建建立立一一条条两两者专用的通信链路,两者时间的交互不受其他进程影响;者专用的通信链路,两者时间的交互不受其他进程影响;    (2) 多对一关系提供服务的进程与多个接受进行交互,多对一关系提供服务的进程与多个接受进行交互,即客户即客户/服务器交互;服务器交互; 第二章 进 程 管 理     (3) 一一对对多多关关系系允允许许一一个个发发送送进进程程与与多多个个接接收收进进程程进进行交互,使发送进程可用广播方式向接收者行交互,使发送进程可用广播方式向接收者(多个多个)发送消息发送消息    (4) 多对多关系允许建立一个公用信箱,让多个进程多对多关系允许建立一个公用信箱,让多个进程都能向信箱中投递消息;也可从信箱中取走属于自己的消都能向信箱中投递消息;也可从信箱中取走属于自己的消息 第二章 进 程 管 理 2.5.3 消息传递系统实现中的若干问题 消息传递系统实现中的若干问题    1.通信链路.通信链路  为使在发送进程和接收进程之间能进行通信,必须在两者  为使在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路之间建立一条通信链路(communication link)。

      有两种方式建有两种方式建立通信链路立通信链路 第一种方式是由发送进程在通信之前用显式的第一种方式是由发送进程在通信之前用显式的“建立连接建立连接”命令命令(原语原语)请求系统为之建立一条通信链路;在链路使用完请求系统为之建立一条通信链路;在链路使用完后,也用显式方式拆除链路这种方式主要用于计算机网络中后,也用显式方式拆除链路这种方式主要用于计算机网络中 第二种方式是发送进程无须明确提出建立链路的请求,只第二种方式是发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令须利用系统提供的发送命令(原语原语),系统会自动地为之建立一,系统会自动地为之建立一条链路这种方式主要用于单机系统中这种方式主要用于单机系统中 第二章 进 程 管 理   根据通信链路的连接方法,又可把通信链路分为两类:  根据通信链路的连接方法,又可把通信链路分为两类:    (1) 点点—点点连连接接通通信信链链路路,,这这时时的的一一条条链链路路只只连连接接两两个个结结点点(进程进程);;    (2) 多多点点连连接接链链路路,,指指用用一一条条链链路路连连接接多多个个(n>2)结结点点(进进程程)。

      第二章 进 程 管 理   而根据通信方式的不同,则又可把链路分成两种:  而根据通信方式的不同,则又可把链路分成两种:    (1) 单向通信链路单向通信链路,只允许发送进程,只允许发送进程A向接收进程向接收进程B发送发送消息,或者相反;消息,或者相反;    (2)双向链路双向链路,既允许,既允许A向向B发送,也允许发送,也允许B向向A发送;发送;  还可根据通信链路容量的不同而把链路分成两类:  还可根据通信链路容量的不同而把链路分成两类: 一是一是无容量通信链路无容量通信链路,在这种通信链路上没有缓冲区,,在这种通信链路上没有缓冲区,因而不能暂存任何消息;因而不能暂存任何消息; 再者就是再者就是有容量通信链路有容量通信链路,指在通信链路中设置了缓冲,指在通信链路中设置了缓冲区,因而能暂存消息缓冲区数目愈多,通信链路的容量区,因而能暂存消息缓冲区数目愈多,通信链路的容量愈大 第二章 进 程 管 理     2.消息的格式.消息的格式  在消息传递系统中所传递的消息,必须具有一定的消息格  在消息传递系统中所传递的消息,必须具有一定的消息格式。

      在单机系统环境中,由于发送进程和接收进程处于同一台式在单机系统环境中,由于发送进程和接收进程处于同一台机器中,有着相同的环境,故其消息格式比较简单;但在计算机器中,有着相同的环境,故其消息格式比较简单;但在计算机网络环境下,不仅源和目标进程所处的环境不同,而且信息机网络环境下,不仅源和目标进程所处的环境不同,而且信息的传输距离很远,可能要跨越若干个完全不同的网络,致使所的传输距离很远,可能要跨越若干个完全不同的网络,致使所用的消息格式比较复杂用的消息格式比较复杂 通常,可把一个消息分成通常,可把一个消息分成消息头消息头和和消息正文消息正文两部分消消息头包括消息在传输时所需的控制信息息头包括消息在传输时所需的控制信息,如源进程名、目标进,如源进程名、目标进程名、消息长度、消息类型、消息编号及发送的日期和时间;程名、消息长度、消息类型、消息编号及发送的日期和时间;而而消息正文消息正文则是发送进程实际上所发送的数据则是发送进程实际上所发送的数据 第二章 进 程 管 理   在某些  在某些OS中,消息采用比较短的中,消息采用比较短的定长消息格式定长消息格式,这便减,这便减少了对消息的处理和存储开销。

      这种方式可用于办公自动化少了对消息的处理和存储开销这种方式可用于办公自动化系统中,为用户提供快速的便笺式通信;但这对要发送较长系统中,为用户提供快速的便笺式通信;但这对要发送较长消息的用户是不方便的消息的用户是不方便的 在有的在有的OS中,采用中,采用变长的消息格式变长的消息格式,即进程所发送消息,即进程所发送消息的长度是可变的系统无论在处理还是在存储变长消息时,的长度是可变的系统无论在处理还是在存储变长消息时,都可能会付出更多的开销,但这方便了用户都可能会付出更多的开销,但这方便了用户 这两种消息格式各有其优缺点,故在很多系统这两种消息格式各有其优缺点,故在很多系统(包括计算包括计算机网络机网络)中,是同时都用的中,是同时都用的 第二章 进 程 管 理     3.进程同步方式.进程同步方式    在在进进程程之之间间进进行行通通信信时时,,同同样样需需要要有有进进程程同同步步机机制制,,以以使使诸诸进进程程间间能能协协调调通通信信不不论论是是发发送送进进程程,,还还是是接接收收进进程程,,在在完完成成消消息息的的发发送送或或接接收收后后,,都都存存在在两两种种可可能能性性,,即即进进程程或或者者继继续续发送发送(接收接收),或者阻塞。

      或者阻塞由此,我们可得到以下三种情况:由此,我们可得到以下三种情况:    (1) 发送进程阻塞,接收进程阻塞发送进程阻塞,接收进程阻塞 这种情况主要用于进程之间紧密同步这种情况主要用于进程之间紧密同步(tight synchronization),,发送进程和接收进程之间无缓冲时发送进程和接收进程之间无缓冲时这两个进程平时都处于阻塞状态,直到有消息传递时这种同步方式进程平时都处于阻塞状态,直到有消息传递时这种同步方式称为称为汇合汇合(rendezrous) 第二章 进 程 管 理     (2) 发送进程不阻塞,接收进程阻塞发送进程不阻塞,接收进程阻塞 这是一种应用最广的进程同步方式平时,发送进程这是一种应用最广的进程同步方式平时,发送进程不阻塞,因而它可以尽快地把一个或多个消息发送给多个目不阻塞,因而它可以尽快地把一个或多个消息发送给多个目标;标; 而接收进程平时则处于阻塞状态,直到发送进程发来而接收进程平时则处于阻塞状态,直到发送进程发来消息时才被唤醒消息时才被唤醒 例如,在服务器上通常都设置了多个服务进程,它们例如,在服务器上通常都设置了多个服务进程,它们分别用于提供不同的服务,如打印服务。

      平时,这些服务进分别用于提供不同的服务,如打印服务平时,这些服务进程都处于阻塞状态,一旦有请求服务的消息到达时,系统便程都处于阻塞状态,一旦有请求服务的消息到达时,系统便唤醒相应的服务进程,去完成用户所要求的服务处理完后,唤醒相应的服务进程,去完成用户所要求的服务处理完后,若无新的服务请求,服务进程又阻塞若无新的服务请求,服务进程又阻塞 第二章 进 程 管 理     (3) 发送进程和接收进程均不阻塞发送进程和接收进程均不阻塞 这也是一种较常见的进程同步形式平时,发送进程和这也是一种较常见的进程同步形式平时,发送进程和接收进程都在忙于自己的事情,仅当发生某事件使它无法继接收进程都在忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待续运行时,才把自己阻塞起来等待 第二章 进 程 管 理   例如,在发送进程和接收进程之间联系着一个消息队列  例如,在发送进程和接收进程之间联系着一个消息队列时,该消息队列最多能接纳时,该消息队列最多能接纳n个消息,这样,发送进程便可个消息,这样,发送进程便可以连续地向消息队列中发送消息而不必等待;接收进程也可以连续地向消息队列中发送消息而不必等待;接收进程也可以连续地从消息队列中取得消息,也不必等待。

      以连续地从消息队列中取得消息,也不必等待 只有当消息队列中的消息数已达到只有当消息队列中的消息数已达到n个时,即消息队列个时,即消息队列已满,发送进程无法向消息队列中发送消息时才会阻塞;类已满,发送进程无法向消息队列中发送消息时才会阻塞;类似地,只有当消息队列中的消息数为似地,只有当消息队列中的消息数为0,接收进程已无法从,接收进程已无法从消息队列中取得消息时才会阻塞消息队列中取得消息时才会阻塞 第二章 进 程 管 理 2.5.4 消息缓冲队列通信机制 消息缓冲队列通信机制    1) 消息缓冲区消息缓冲区    在在消消息息缓缓冲冲队队列列通通信信方方式式中中,,主主要要利利用用的的数数据据结结构构是是消消息缓冲区它可描述如下:息缓冲区它可描述如下:    type message buffer=record                 sender;发送者进程标识符;发送者进程标识符                 size;; 消息长度消息长度                 text;; 消息正文消息正文                 next;; 指向下一个消息缓冲区的指针指向下一个消息缓冲区的指针             end 第二章 进 程 管 理     2) PCB中有关通信的数据项中有关通信的数据项  在操作系统中采用了消息缓冲队列通信机制时,除了需  在操作系统中采用了消息缓冲队列通信机制时,除了需要为进程设置消息缓冲队列外,还应在进程的要为进程设置消息缓冲队列外,还应在进程的PCB中增加消中增加消息队列队首指针,用于对消息队列进行操作,以及用于实现息队列队首指针,用于对消息队列进行操作,以及用于实现同步的互斥信号量同步的互斥信号量mutex和资源信号量和资源信号量sm。

      在在PCB中应增加中应增加的数据项可描述如下:的数据项可描述如下: 第二章 进 程 管 理 type processcontrol block=record                                           mq    ;; 消息队列队首指针消息队列队首指针                 mutex;; 消息队列互斥信号量消息队列互斥信号量                   sm;; 消息队列资源信号量消息队列资源信号量                                           end …… 第二章 进 程 管 理   2.发送原语.发送原语  发送进程在利用发送原语发送消息之前,应先在自己的内 发送进程在利用发送原语发送消息之前,应先在自己的内存空间设置一发送区存空间设置一发送区a,见图,见图2-14 所示把待发送的消息正文、所示把待发送的消息正文、发送进程标识符、消息长度等信息填入其中,然后调用发送原发送进程标识符、消息长度等信息填入其中,然后调用发送原语,把消息发送给目标语,把消息发送给目标(接收接收)进程。

      发送原语首先根据发送区进程发送原语首先根据发送区a中所设置的消息长度中所设置的消息长度a.size来申请一缓冲区来申请一缓冲区i,接着把发送区,接着把发送区a中的信息复制到缓冲区中的信息复制到缓冲区i中为了能将中为了能将i挂在接收进程的消息队挂在接收进程的消息队列列mq上,应先获得接收进程的内部标识符上,应先获得接收进程的内部标识符j,然后将,然后将i挂在挂在j.mq上由于该队列属于临界资源,故在执行上由于该队列属于临界资源,故在执行insert操作的前后,操作的前后,都要执行都要执行wait和和signal操作 第二章 进 程 管 理 发送原语可描述如下:发送原语可描述如下:    procedure send(receiver,,a)      begin        getbuf(a.size,i);  根据;  根据a.size申请缓冲区;申请缓冲区;        i.sender:= a.sender;; 将发送区将发送区a中的信息复制到消息缓冲区中的信息复制到消息缓冲区i中;中;        i.size:=a.size;;        i.text:=a.text;;        i.next:=0;;        getid(PCB set,,receiver.j);获得接收进程内部标识符;;获得接收进程内部标识符;        wait(j.mutex);;        insert(j.mq,,i);  ;  将消息缓冲区插入消息队列;将消息缓冲区插入消息队列;        signal(j.mutex);;        signal(j.sm);;    end 第二章 进 程 管 理 图 2-14 消息缓冲通信 第二章 进 程 管 理     3.接收原语.接收原语  接收进程调用接收原语  接收进程调用接收原语receive(b),从自己的消息缓冲,从自己的消息缓冲队列队列mq中摘下第一个消息缓冲区中摘下第一个消息缓冲区i,并将其中的数据复制到,并将其中的数据复制到以以b为首址的指定消息接收区内。

      接收原语描述如下为首址的指定消息接收区内接收原语描述如下: 第二章 进 程 管 理 procedure receive(b)    begin        j:= internal name; ;  j为接收进程内部的标识符;为接收进程内部的标识符;        wait(j.sm);;        wait(j.mutex);;        remove(j.mq,,i); ;  将消息队列中第一个消息移出;将消息队列中第一个消息移出;        signal(j.mutex);;        b.sender:=i.sender; ; 将消息缓冲区将消息缓冲区i中的信息复制到接收区中的信息复制到接收区b;;        b.size:=i.size;;        b.text:=i.text;;    end 第二章 进 程 管 理 2.6 线 程 线 程 2.6.1 线程的基本概念 线程的基本概念    1.线程的引入.线程的引入  如果说,在操作系统中引入进程的目的,是为了使多个  如果说,在操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使所付出的时空开销,使OS具有更好的并发性。

      具有更好的并发性 第二章 进 程 管 理 为了说明这一点,我们首先来回顾进程的两个基本属性为了说明这一点,我们首先来回顾进程的两个基本属性: ①① 进程是一个可拥有资源的独立单位;进程是一个可拥有资源的独立单位;②② 进程同时又是一个可独立调度和分派的基本单位进程同时又是一个可独立调度和分派的基本单位 正正是是由由于于进进程程有有这这两两个个基基本本属属性性,,才才使使之之成成为为一一个个能能独独立立运运行行的的基基本本单单位位,,从从而而也也就就构构成成了了进进程程并并发发执执行行的的基基础础然然而而,,为为使使程程序序能能并并发发执执行行,,系系统统还还必必须须进进行行以以下下的的一一系系列列操作 第二章 进 程 管 理     1) 创建进程创建进程    系系统统在在创创建建一一个个进进程程时时,,必必须须为为它它分分配配其其所所必必需需的的、、除除处处理理机机以以外外的的所所有有资资源源,,如如内内存存空空间间、、I/O设设备备,,以以及及建建立立相相应应的的PCB    2) 撤消进程撤消进程  系统在撤消进程时,又必须先对其所占有的资源执行回收  系统在撤消进程时,又必须先对其所占有的资源执行回收操作,然后再撤消操作,然后再撤消PCB。

      第二章 进 程 管 理     3) 进程切换进程切换    对对进进程程进进行行切切换换时时,,由由于于要要保保留留当当前前进进程程的的CPU环环境境和和设置新选中进程的设置新选中进程的CPU环境,因而须花费不少的处理机时间环境,因而须花费不少的处理机时间  换言之,由于进程是一个资源的拥有者,因而在创建、  换言之,由于进程是一个资源的拥有者,因而在创建、撤消和切换中,系统必须为之付出较大的时空开销正因如撤消和切换中,系统必须为之付出较大的时空开销正因如此,在系统中所设置的进程,其数目不宜过多,进程切换的此,在系统中所设置的进程,其数目不宜过多,进程切换的频率也不宜过高,这也就限制了并发程度的进一步提高频率也不宜过高,这也就限制了并发程度的进一步提高 第二章 进 程 管 理   如何能使多个程序更好地并发执行同时又尽量减少系统  如何能使多个程序更好地并发执行同时又尽量减少系统的开销,已成为近年来设计操作系统时所追求的重要目标的开销,已成为近年来设计操作系统时所追求的重要目标 有不少研究操作系统的学者们想到,若能将进程的上述有不少研究操作系统的学者们想到,若能将进程的上述两个属性分开,由操作系统分开处理,亦即对于作为调度和两个属性分开,由操作系统分开处理,亦即对于作为调度和分派的基本单位,不同时作为拥有资源的单位,以做到分派的基本单位,不同时作为拥有资源的单位,以做到“轻轻装上阵装上阵”;而对于拥有资源的基本单位,又不对之进行频繁;而对于拥有资源的基本单位,又不对之进行频繁的切换。

      的切换 正是在这种思想的指导下,形成了线程的概念正是在这种思想的指导下,形成了线程的概念 第二章 进 程 管 理     2.线程与进程的比较.线程与进程的比较    1) 调度调度  在传统的操作系统中,作为拥有资源的基本单位和独立  在传统的操作系统中,作为拥有资源的基本单位和独立调度、分派的基本单位都是进程而在引入线程的操作系统调度、分派的基本单位都是进程而在引入线程的操作系统中,则把线程作为调度和分派的基本单位,而进程作为资源中,则把线程作为调度和分派的基本单位,而进程作为资源拥有的基本单位,把传统进程的两个属性分开,使线程基本拥有的基本单位,把传统进程的两个属性分开,使线程基本上不拥有资源,这样线程便能轻装前进,从而可显著地提高上不拥有资源,这样线程便能轻装前进,从而可显著地提高系统的并发程度系统的并发程度 在同一进程中,线程的切换不会引起进程的切换,但从在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,将会引起一个进程中的线程切换到另一个进程中的线程时,将会引起进程的切换进程的切换    第二章 进 程 管 理     2) 并发性并发性  在引入线程的操作系统中,不仅  在引入线程的操作系统中,不仅进程之间可以并发执行进程之间可以并发执行,,而且而且在一个进程中的多个线程之间亦可并发执行在一个进程中的多个线程之间亦可并发执行,使得操作,使得操作系统具有更好的并发性,从而能更加有效地提高系统资源的系统具有更好的并发性,从而能更加有效地提高系统资源的利用率和系统的吞吐量。

      利用率和系统的吞吐量 第二章 进 程 管 理 例例如如,,在在一一个个未未引引入入线线程程的的单单CPU操操作作系系统统中中,,若若仅仅设设置置一一个个文文件件服服务务进进程程,,当当该该进进程程由由于于某某种种原原因因而而被被阻阻塞塞时时,,便没有其它的文件服务进程来提供服务便没有其它的文件服务进程来提供服务 在在引引入入线线程程的的操操作作系系统统中中,,则则可可以以在在一一个个文文件件服服务务进进程程中中设设置置多多个个服服务务线线程程当当第第一一个个线线程程等等待待时时,,文文件件服服务务进进程程中中的的第第二二个个线线程程可可以以继继续续运运行行,,以以提提供供文文件件服服务务;;当当第第二二个个线程阻塞时,则可由第三个继续执行,提供服务线程阻塞时,则可由第三个继续执行,提供服务 显显然然,,这这样样的的方方法法可可以以显显著著地地提提高高文文件件服服务务的的质质量量和和系系统的吞吐量统的吞吐量 第二章 进 程 管 理     3) 拥有资源拥有资源  不论是传统的操作系统,还是引入了线程的操作系统,  不论是传统的操作系统,还是引入了线程的操作系统,进程都可以拥有资源,是系统中拥有资源的一个基本单位进程都可以拥有资源,是系统中拥有资源的一个基本单位。

      一般而言,线程自己不拥有系统资源一般而言,线程自己不拥有系统资源(也有一点必不可少也有一点必不可少的资源的资源),但它可以访问其隶属进程的资源,即一个进程的代,但它可以访问其隶属进程的资源,即一个进程的代码段、数据段及所拥有的系统资源,如已打开的文件、码段、数据段及所拥有的系统资源,如已打开的文件、I/O设设备等,可以供该进程中的所有线程所共享备等,可以供该进程中的所有线程所共享 第二章 进 程 管 理     4) 系统开销系统开销  在  在创建或撤消进程创建或撤消进程时,系统都要为之创建和回收进程控时,系统都要为之创建和回收进程控制块,分配或回收资源,如内存空间和制块,分配或回收资源,如内存空间和I/O设备等,操作系统设备等,操作系统所付出的开销明显大于线程创建或撤消时的开销所付出的开销明显大于线程创建或撤消时的开销 类似地,在类似地,在进程切换进程切换时,涉及到当前进程时,涉及到当前进程CPU环境的保环境的保存及新被调度运行进程的存及新被调度运行进程的CPU环境的设置,而线程的切换则环境的设置,而线程的切换则仅需保存和设置少量寄存器内容,不涉及存储器管理方面的仅需保存和设置少量寄存器内容,不涉及存储器管理方面的操作,所以就切换代价而言,进程也是远高于线程的。

      操作,所以就切换代价而言,进程也是远高于线程的 此外,由于一个进程中的多个线程具有相同的地址空间,此外,由于一个进程中的多个线程具有相同的地址空间,在同步和通信的实现方面线程也比进程容易在一些操作系在同步和通信的实现方面线程也比进程容易在一些操作系统中,线程的切换、同步和通信都无须操作系统内核的干预统中,线程的切换、同步和通信都无须操作系统内核的干预 第二章 进 程 管 理     3.线程的属性.线程的属性    在在多多线线程程OS中中,,通通常常是是在在一一个个进进程程中中包包括括多多个个线线程程,,每每个个线线程程都都是是作作为为利利用用CPU的的基基本本单单位位,,是是花花费费最最小小开开销销的的实实体线程具有下述属性线程具有下述属性    (1) 轻型实体线程中的实体基本上不拥有系统资源,轻型实体线程中的实体基本上不拥有系统资源,只是有一点必不可少的、只是有一点必不可少的、 能保证其独立运行的资源,比如,能保证其独立运行的资源,比如,在每个线程中都应具有一个用于控制线程运行的线程控制块在每个线程中都应具有一个用于控制线程运行的线程控制块TCB,用于指示被执行指令序列的程序计数器,保留局部变,用于指示被执行指令序列的程序计数器,保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。

      量、少数状态参数和返回地址等的一组寄存器和堆栈 第二章 进 程 管 理     (2) 独独立立调调度度和和分分派派的的基基本本单单位位在在多多线线程程OS中中,,线线程程是是能能独独立立运运行行的的基基本本单单位位,,因因而而也也是是独独立立调调度度和和分分派派的的基基本本单位由于线程很单位由于线程很“轻轻”,故线程的切换非常迅速且开销小故线程的切换非常迅速且开销小    (3) 可可并并发发执执行行在在一一个个进进程程中中的的多多个个线线程程之之间间可可以以并并发发执执行行,,甚甚至至允允许许在在一一个个进进程程中中的的所所有有线线程程都都能能并并发发执执行行;;同同样,不同进程中的线程也能并发执行样,不同进程中的线程也能并发执行    (4) 共享进程资源共享进程资源在同一进程中的各个线程都可以共享在同一进程中的各个线程都可以共享该进程所拥有的资源该进程所拥有的资源,这首先表现在所有线程都具有相同的,这首先表现在所有线程都具有相同的地址空间地址空间(进程的地址空间进程的地址空间)这意味着线程可以访问该地址这意味着线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的已空间中的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。

      打开文件、定时器、信号量机构等 第二章 进 程 管 理     4.线程的状态.线程的状态    (1) 状态参数在状态参数在OS中的每一个线程都可以利用线程标中的每一个线程都可以利用线程标识符和一组状态参数进行描述状态参数通常有这样几项:识符和一组状态参数进行描述状态参数通常有这样几项:①① 寄存器状态,它包括程序计数器寄存器状态,它包括程序计数器PC和堆栈指针中的内容;和堆栈指针中的内容;②② 堆栈,在堆栈中通常保存有局部变量和返回地址;堆栈,在堆栈中通常保存有局部变量和返回地址;③③ 线程运行状态,用于描述线程正处于何种运行状态;线程运行状态,用于描述线程正处于何种运行状态;④④ 优先级,描述线程执行的优先程度;优先级,描述线程执行的优先程度;⑤⑤ 线程专有存储器,用于保存线程自己的局部变量拷贝;线程专有存储器,用于保存线程自己的局部变量拷贝;⑥⑥ 信号屏蔽,即对某些信号加以屏蔽信号屏蔽,即对某些信号加以屏蔽 第二章 进 程 管 理     (2) 线程运行状态如同传统的进程一样,在各线程之间线程运行状态如同传统的进程一样,在各线程之间也存在着共享资源和相互合作的制约关系,致使线程在运行时也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。

      相应地,线程在运行时也具有下述三种基本状也具有间断性相应地,线程在运行时也具有下述三种基本状态态: ①① 执行状态,表示线程正获得处理机而运行;执行状态,表示线程正获得处理机而运行;②② 就绪状态,指线程已具备了各种执行条件,一旦获得就绪状态,指线程已具备了各种执行条件,一旦获得CPU便可执行的状态;便可执行的状态;③③ 阻塞状态,指线程在执行中因某事件而受阻,处于暂停执阻塞状态,指线程在执行中因某事件而受阻,处于暂停执行时的状态行时的状态      第二章 进 程 管 理     5.线程的创建和终止.线程的创建和终止    在在多多线线程程OS环环境境下下,,应应用用程程序序在在启启动动时时,,通通常常仅仅有有一一个个线线程程在在执执行行,,该该线线程程被被人人们们称称为为“初初始始化化线线程程”它它可可根根据据需要再去创建若干个线程需要再去创建若干个线程 在在创创建建新新线线程程时时,,需需要要利利用用一一个个线线程程创创建建函函数数(或或系系统统调调用用),,并并提提供供相相应应的的参参数数,,如如指指向向线线程程主主程程序序的的入入口口指指针针、、堆堆栈的大小,以及用于调度的优先级等。

      栈的大小,以及用于调度的优先级等 在线程程创创建建函函数数执执行行完完后后,,将将返返回回一一个个线线程程标标识识符符供供以以后后使用 第二章 进 程 管 理   如同进程一样,  如同进程一样,线程也是具有生命期的线程也是具有生命期的终止线程的方终止线程的方式有两种:一种是程完成了自己的工作后自愿退出;另式有两种:一种是程完成了自己的工作后自愿退出;另一种是线程在运行中出现错误或由于某种原因而被其它线程一种是线程在运行中出现错误或由于某种原因而被其它线程强行终止强行终止 但有些线程但有些线程(主要是系统线程主要是系统线程),在它们一旦被建立起来,在它们一旦被建立起来之后,便一直运行下去而不再被终止之后,便一直运行下去而不再被终止 在大多数的在大多数的OS中,中,线程被中止后并不立即释放它所占有线程被中止后并不立即释放它所占有的资源,的资源,只有当进程中的其它线程执行了只有当进程中的其它线程执行了分离函数分离函数后,被终后,被终止的线程才与资源分离,此时的资源才能被其它线程利用止的线程才与资源分离,此时的资源才能被其它线程利用 第二章 进 程 管 理   虽已被终止但尚未释放资源的线程,仍可以被需要它  虽已被终止但尚未释放资源的线程,仍可以被需要它的线程所调用,以的线程所调用,以使被终止线程重新恢复运行使被终止线程重新恢复运行。

      为此,为此,调用者线程调用者线程须调用一条被称为须调用一条被称为“等待线程终止等待线程终止”的连接命令,来与该线程进行连接的连接命令,来与该线程进行连接 如果在一个调用者线程调用如果在一个调用者线程调用“等待线程终止等待线程终止”的连接的连接命令试图与指定线程相连接时,命令试图与指定线程相连接时,若指定线程尚未被终止若指定线程尚未被终止,,则调用连接命令的线程将会阻塞,直至指定线程被终止后则调用连接命令的线程将会阻塞,直至指定线程被终止后才能实现它与调用者线程的连接并继续执行;才能实现它与调用者线程的连接并继续执行;若指定线程若指定线程已被终止,已被终止,则调用者线程不会被阻塞而是继续执行则调用者线程不会被阻塞而是继续执行 第二章 进 程 管 理     6.多线程.多线程OS中的中的进程进程    在在多多线线程程OS中中,,进进程程是是作作为为拥拥有有系系统统资资源源的的基基本本单单位位,,通通常常的的进进程程都都包包含含多多个个线线程程并并为为它它们们提提供供资资源源,,但但此此时时的的进进程程就就不不再再作作为为一一个个执执行行的的实实体体多多线线程程OS中中的的进进程程有有以以下下属属性:性:    (1) 作为系统资源分配的单位。

      作为系统资源分配的单位 在多线程在多线程OS中,仍是将进程作为系统资源分配的基本单中,仍是将进程作为系统资源分配的基本单位,在任一进程中所拥有的资源包括受到分别保护的用户地位,在任一进程中所拥有的资源包括受到分别保护的用户地址空间、用于实现进程间和线程间同步和通信的机制、已打址空间、用于实现进程间和线程间同步和通信的机制、已打开的文件和已申请到的开的文件和已申请到的I/O设备,以及一张由核心进程维护设备,以及一张由核心进程维护的地址映射表,该表用于实现用户程序的逻辑地址到其内存的地址映射表,该表用于实现用户程序的逻辑地址到其内存物理地址的映射物理地址的映射 第二章 进 程 管 理     (2) 可包括多个线程可包括多个线程 通通常常,,一一个个进进程程都都含含有有多多个个相相对对独独立立的的线线程程,,其其数数目目可可多多可可少少,,但但至至少少也也要要有有一一个个线线程程,,由由进进程程为为这这些些(个个)线线程程提提供供资资源及运行环境,使这些线程可并发执行源及运行环境,使这些线程可并发执行 在在OS中的所有线程都只能属于某一个特定进程。

      中的所有线程都只能属于某一个特定进程 第二章 进 程 管 理     (3) 进程不是一个可执行的实体进程不是一个可执行的实体 在多线程在多线程OS中,是把线程作为独立运行的基本单位,所中,是把线程作为独立运行的基本单位,所以此时的进程已不再是一个可执行的实体以此时的进程已不再是一个可执行的实体 虽然如此,进程仍具有与执行相关的状态虽然如此,进程仍具有与执行相关的状态 例如,例如,所谓进程处于所谓进程处于“执行执行”状态,实际上是指该进程中状态,实际上是指该进程中的某线程正在执行的某线程正在执行 此外,对进程所施加的与进程状态有关的操作,也对其线此外,对进程所施加的与进程状态有关的操作,也对其线程起作用例如,在把某个进程挂起时,该进程中的所有线程程起作用例如,在把某个进程挂起时,该进程中的所有线程也都将被挂起;又如,在把某进程激活时,属于该进程的所有也都将被挂起;又如,在把某进程激活时,属于该进程的所有线程也都将被激活线程也都将被激活 第二章 进 程 管 理 2.6.2 线程间的同步和通信 线程间的同步和通信    1.互斥锁.互斥锁(mutex)  互斥锁是一种比较简单的、用于实现线程间对资源互斥访  互斥锁是一种比较简单的、用于实现线程间对资源互斥访问的机制。

      由于操作互斥锁的时间和空间开销都较低,因而较问的机制由于操作互斥锁的时间和空间开销都较低,因而较适合于高频度使用的关键共享数据和程序段适合于高频度使用的关键共享数据和程序段 互斥锁可以有两种状态,即开锁互斥锁可以有两种状态,即开锁(unlock)和关锁和关锁(lock)状态状态相应地,可用两条命令相应地,可用两条命令(函数函数)对互斥锁进行操作其中的关锁对互斥锁进行操作其中的关锁lock操作用于将操作用于将mutex关上,开锁操作关上,开锁操作unlock则用于打开则用于打开mutex 第二章 进 程 管 理     当当一一个个线线程程需需要要读读/写写一一个个共共享享数数据据段段时时,,线线程程首首先先应应为为该数据段所设置的该数据段所设置的mutex执行关锁命令执行关锁命令 命命令令首首先先判判别别mutex的的状状态态,,如如果果它它已已处处于于关关锁锁状状态态,,则则试试图图访访问问该该数数据据段段的的线线程程将将被被阻阻塞塞;;而而如如果果mutex是是处处于于开开锁锁状态,则将状态,则将mutex关上后便去读关上后便去读/写该数据段写该数据段 在线程程完完成成对对数数据据的的读读/写写后后,,必必须须再再发发出出开开锁锁命命令令将将mutex打打开开,,同同时时还还须须将将阻阻塞塞在在该该互互斥斥锁锁上上的的一一个个线线程程唤唤醒醒,,其它的线程仍被阻塞在等待其它的线程仍被阻塞在等待mutex打开的队列上。

      打开的队列上    第二章 进 程 管 理     另另外外,,为为了了减减少少线线程程被被阻阻塞塞的的机机会会,,在在有有的的系系统统中中还还提提供供了一种用于了一种用于mutex上的操作命令上的操作命令Trylock 当当一一个个线线程程在在利利用用Trylock命命令令去去访访问问mutex时时,,若若mutex处处于于开开锁锁状状态态,,Trylock将将返返回回一一个个指指示示成成功功的的状状态态码码;;反反之之,,若若mutex处处于于关关锁锁状状态态,,则则Trylock并并不不会会阻阻塞塞该该线线程程,,而而只只是是返回一个指示操作失败的状态码返回一个指示操作失败的状态码    第二章 进 程 管 理     2.条件变量.条件变量  在许多情况下,只利用  在许多情况下,只利用mutex来实现互斥访问可能会引来实现互斥访问可能会引起死锁,我们通过一个例子来说明这一点有一个线程在对起死锁,我们通过一个例子来说明这一点有一个线程在对mutex 1执行关锁操作成功后,便进入一临界区执行关锁操作成功后,便进入一临界区C,若在临界,若在临界区内该线程又须访问某个临界资源区内该线程又须访问某个临界资源R,同样也为,同样也为R设置另一设置另一互斥锁互斥锁mutex 2。

      假如资源假如资源R此时正处于忙碌状态,线程在对此时正处于忙碌状态,线程在对mutex 2执行关锁操作后必将被阻塞,这样将使执行关锁操作后必将被阻塞,这样将使mutex 1一直一直保持关锁状态;如果保持了资源保持关锁状态;如果保持了资源R的线程也要求进入临界区的线程也要求进入临界区C,但由于,但由于mutex 1一直保持关锁状态而无法进入临界区,这一直保持关锁状态而无法进入临界区,这样便形成了死锁为了解决这个问题便引入了条件变量样便形成了死锁为了解决这个问题便引入了条件变量 第二章 进 程 管 理     每每一一个个条条件件变变量量通通常常都都与与一一个个互互斥斥锁锁一一起起使使用用,,亦亦即即,,在创建一个互斥锁时便联系着一个条件变量在创建一个互斥锁时便联系着一个条件变量 单单纯纯的的互互斥斥锁锁用用于于短短期期锁锁定定,,主主要要是是用用来来保保证证对对临临界界区区的的互斥进入互斥进入 而而条条件件变变量量则则用用于于线线程程的的长长期期等等待待,,直直至至所所等等待待的的资资源源成成为可用的资源为可用的资源 第二章 进 程 管 理   现在,我们看看如何利用互斥锁和条件变量来实现对资  现在,我们看看如何利用互斥锁和条件变量来实现对资源源R的访问。

      的访问 线程首先对线程首先对mutex执行关锁操作,若成功便进入临界区,执行关锁操作,若成功便进入临界区,然后查找用于描述该资源状态的数据结构,以了解资源的情然后查找用于描述该资源状态的数据结构,以了解资源的情况只要发现所需资源只要发现所需资源R正处于忙碌状态正处于忙碌状态,,线程便转为等待状线程便转为等待状态,态,并对并对mutex执行开锁操作后,等待该资源被释放;执行开锁操作后,等待该资源被释放;若资源若资源处于空闲状态,处于空闲状态,表明线程可以使用该资源,于是将该资源设表明线程可以使用该资源,于是将该资源设置为忙碌状态,再对置为忙碌状态,再对mutex执行开锁操作执行开锁操作 下面给出了对上述资源的下面给出了对上述资源的申请申请(左半部分左半部分)和和释放释放(右半部分右半部分)操作的描述操作的描述 第二章 进 程 管 理 Lock mutex                    Lock mutex  check data structures;; mark resource as free;;  while(resource busy); ;  unlock mutex;;  wait(condition variable); ;  wakeup(condition variable);;  mark resource as busy;;unlock mutex;; 第二章 进 程 管 理   原来占有资源  原来占有资源R的线程在使用完该资源后,便按照右半的线程在使用完该资源后,便按照右半部分的描述释放该资源,其中的部分的描述释放该资源,其中的wakeup(condition variable)表示去唤醒在指定条件变量上等待的一个或多个线程。

      表示去唤醒在指定条件变量上等待的一个或多个线程 在大多数情况下,由于所释放的是在大多数情况下,由于所释放的是临界资源临界资源,此时所唤,此时所唤醒的只能是在条件变量上等待的醒的只能是在条件变量上等待的某一个某一个线程,其它线程仍继线程,其它线程仍继续在该队列上等待续在该队列上等待 但如果线程所释放的是一个数据文件,该文件允许多个线但如果线程所释放的是一个数据文件,该文件允许多个线程同时对它执行读操作在这种情况下,当一个写线程完成程同时对它执行读操作在这种情况下,当一个写线程完成写操作并释放该文件后,如果此时在该条件变量上还有多个写操作并释放该文件后,如果此时在该条件变量上还有多个读线程在等待,则该线程可以唤醒读线程在等待,则该线程可以唤醒所有的等待线程所有的等待线程 第二章 进 程 管 理     3.信号量机制.信号量机制    1) 私用信号量私用信号量(private samephore)  当某线程需利用信号量来实现  当某线程需利用信号量来实现同一进程中各线程之间的同一进程中各线程之间的同步同步时,时,可调用创建信号量的命令来创建一私用信号量可调用创建信号量的命令来创建一私用信号量,其,其数据结构存放在应用程序的地址空间中。

      数据结构存放在应用程序的地址空间中 私用信号量属于特定的进程所有,私用信号量属于特定的进程所有,OS并不知道私用信号并不知道私用信号量的存在量的存在,因此,一旦发生私用信号量的占用者异常结束或,因此,一旦发生私用信号量的占用者异常结束或正常结束,但并未释放该信号量所占有空间的情况时,系统正常结束,但并未释放该信号量所占有空间的情况时,系统将无法使它恢复为将无法使它恢复为0(空空),也不能将它传送给下一个请求它的,也不能将它传送给下一个请求它的线程 第二章 进 程 管 理     2) 公用信号量公用信号量(public semaphort)  公用信号量是为  公用信号量是为实现不同进程间或不同进程中各线程之实现不同进程间或不同进程中各线程之间的同步而设置的间的同步而设置的 由于它有着一个公开的名字供所有的进程使用,故而把由于它有着一个公开的名字供所有的进程使用,故而把它称为公用信号量它称为公用信号量 其数据结构是存放在受保护的系统存储区中,由其数据结构是存放在受保护的系统存储区中,由OS为为它分配空间并进行管理,故也称为系统信号量它分配空间并进行管理,故也称为系统信号量。

      如果信号量的占有者在结束时未释放该公用信号量,则如果信号量的占有者在结束时未释放该公用信号量,则OS会自动将该信号量空间回收,并通知下一进程可见,会自动将该信号量空间回收,并通知下一进程可见,公用信号量是一种比较安全的同步机制公用信号量是一种比较安全的同步机制 第二章 进 程 管 理 2.6.3 线程的实现方式 线程的实现方式    1.内核支持线程.内核支持线程  对于通常的进程,无论是系统进程还是用户进程,进程  对于通常的进程,无论是系统进程还是用户进程,进程的创建、的创建、 撤消,以及要求由系统设备完成的撤消,以及要求由系统设备完成的I/O操作,都是利操作,都是利用系统调用而进入内核,再由内核中的相应处理程序予以完用系统调用而进入内核,再由内核中的相应处理程序予以完成的 进程的切换同样是在内核的支持下实现的因此我们说,进程的切换同样是在内核的支持下实现的因此我们说,不论什么进程,它们都是在操作系统内核的支持下运行的,不论什么进程,它们都是在操作系统内核的支持下运行的,是与内核紧密相关的是与内核紧密相关的 第二章 进 程 管 理     这这 里里 所所 谓谓 的的 内内 核核 支支 持持 线线 程程 KST(Kernel Supported Threads),,也也都都同同样样是是在在内内核核的的支支持持下下运运行行的的,,即即无无论论是是用用户户进进程程中中的的线线程程,,还还是是系系统统进进程程中中的的线线程程,,他他们们的的创创建建、、撤撤消消和和切切换换等等也也是是依依靠靠内内核核,,在在内内核核空空间间实实现现的的。

      此此外外,,在在内内核核空空间间还还为为每每一一个个内内核核支支持持线线程程设设置置了了一一个个线线程程控控制制块块TCB,,内核是根据该控制块而感知某线程的存在内核是根据该控制块而感知某线程的存在,并对其加以控制并对其加以控制  这种线程实现方式主要有如下四个优点:  这种线程实现方式主要有如下四个优点:    (1) 在多处理器系统中,内核能够同时调度同一进程中多在多处理器系统中,内核能够同时调度同一进程中多个线程并行执行;个线程并行执行; 第二章 进 程 管 理     (2) 如如果果进进程程中中的的一一个个线线程程被被阻阻塞塞了了,,内内核核可可以以调调度度该该进进程程中中的的其其它它线线程程占占有有处处理理器器运运行行,,也也可可以以运运行行其其它它进进程程中中的线程;的线程;    (3) 内内核核支支持持线线程程具具有有很很小小的的数数据据结结构构和和堆堆栈栈,,线线程程的的切换比较快,切换开销小;切换比较快,切换开销小;    (4) 内内核核本本身身也也可可以以采采用用多多线线程程技技术术,,可可以以提提高高系系统统的的执行速度和效率执行速度和效率  内核支持线程的主要缺点是:  内核支持线程的主要缺点是:对于用户的线程切换而言,对于用户的线程切换而言,其模式切换的开销较大其模式切换的开销较大,在同一个进程中,,在同一个进程中,从一个线程切换从一个线程切换到另一个线程时,需要从用户态转到内核态进行到另一个线程时,需要从用户态转到内核态进行,这是因为,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核用户进程的线程在用户态运行,而线程调度和管理是在内核实现的,系统开销较大。

      实现的,系统开销较大 第二章 进 程 管 理     2.用户级线程.用户级线程    用户级线程用户级线程ULT(User Level Threads)仅存在于用户空间中仅存在于用户空间中对于这种线程的创建、撤消、线程之间的同步与通信等功能,对于这种线程的创建、撤消、线程之间的同步与通信等功能,都无须利用系统调用来实现都无须利用系统调用来实现 对于用户级线程的切换,通常发生在一个应用进程的诸多对于用户级线程的切换,通常发生在一个应用进程的诸多线程之间,这时,也同样无须内核的支持由于切换的规则远线程之间,这时,也同样无须内核的支持由于切换的规则远比进程调度和切换的规则简单,因而使线程的切换速度特别快比进程调度和切换的规则简单,因而使线程的切换速度特别快可见,这种线程是与内核无关的可见,这种线程是与内核无关的 我们可以为一个应用程序建立多个用户级线程在一个系我们可以为一个应用程序建立多个用户级线程在一个系统中的用户级线程的数目可以达到数百个至数千个统中的用户级线程的数目可以达到数百个至数千个由于这些由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作线程的任务控制块都是设置在用户空间,而线程所执行的操作也无须内核的帮助,因而内核完全不知道用户级线程的存在。

      也无须内核的帮助,因而内核完全不知道用户级线程的存在 第二章 进 程 管 理     值值得得说说明明的的是是,,对对于于设设置置了了用用户户级级线线程程的的系系统统,,其其调调度度仍仍是是以以进进程程为为单单位位进进行行的的在在采采用用轮轮转转调调度度算算法法时时,,各各个个进进程程轮轮流流执执行行一一个个时时间间片片,,这这对对诸诸进进程程而而言言似似乎乎是是公公平平的的但但假假如如在在进进程程A中中包包含含了了一一个个用用户户级级线线程程,,而而在在另另一一个个进进程程B中中含含有有100个个用用户户级级线线程程,,这这样样,,进进程程A中中线线程程的的运运行行时时间间将将是是进进程程B中中各各线线程程运运行行时时间间的的100倍倍;;相相应应地地,,其其速速度度要要快快上上100倍  假如系统中设置的是内核支持线程,则调度便是以线程  假如系统中设置的是内核支持线程,则调度便是以线程为单位进行的在采用轮转法调度时,是各个线程轮流执行为单位进行的在采用轮转法调度时,是各个线程轮流执行一个时间片同样假定进程一个时间片同样假定进程A中只有一个内核支持线程,而中只有一个内核支持线程,而在进程在进程B中有中有100个内核支持线程。

      此时进程个内核支持线程此时进程B可以获得的可以获得的CPU时间是进程时间是进程A的的100倍,且进程倍,且进程B可使可使100个系统调用并个系统调用并发工作 第二章 进 程 管 理     使使用用用用户户级级线线程程方方式式有有许许多多优优点点,,主主要要表表现现在在如如下下三三个个方面:方面:    (1) 线线程程切切换换不不需需要要转转换换到到内内核核空空间间,,对对一一个个进进程程而而言言,,其其所所有有线线程程的的管管理理数数据据结结构构均均在在该该进进程程的的用用户户空空间间中中,,管管理理线线程程切切换换的的线线程程库库也也在在用用户户地地址址空空间间运运行行因因此此,,进进程程不不必必切切换换到到内内核核方方式式来来做做线线程程管管理理,,从从而而节节省省了了模模式式切切换换的的开开销销,,也节省了内核的宝贵资源也节省了内核的宝贵资源    (2) 调度算法可以是进程专用的调度算法可以是进程专用的在不干扰操作系统调度在不干扰操作系统调度的情况下,不同的进程可以根据自身需要,选择不同的调度的情况下,不同的进程可以根据自身需要,选择不同的调度算法对自己的线程进行管理和调度,而与操作系统的低级调算法对自己的线程进行管理和调度,而与操作系统的低级调度算法是无关的。

      度算法是无关的 第二章 进 程 管 理     (3) 用户级线程的实现与操作系统平台无关用户级线程的实现与操作系统平台无关,因为对于线,因为对于线程管理的代码是在用户程序内的,属于用户程序的一部分,程管理的代码是在用户程序内的,属于用户程序的一部分,所有的应用程序都可以对之进行共享所有的应用程序都可以对之进行共享 因此,用户级线程甚至可以在不支持线程机制的操作系因此,用户级线程甚至可以在不支持线程机制的操作系统平台上实现统平台上实现 第二章 进 程 管 理   用户级线程实现方式的主要缺点在于如下两个方面:  用户级线程实现方式的主要缺点在于如下两个方面:    (1) 系系统统调调用用的的阻阻塞塞问问题题在在基基于于进进程程机机制制的的操操作作系系统统中中,,大大多多数数系系统统调调用用将将阻阻塞塞进进程程,,因因此此,,当当线线程程执执行行一一个个系系统统调调用用时时,,不不仅仅该该线线程程被被阻阻塞塞,,而而且且进进程程内内的的所所有有线线程程都都会会被被阻阻塞塞而而在在内内核核支支持持线线程程方方式式中中,,则则进进程程中中的的其其它它线线程程仍仍然可以运行。

      然可以运行    (2) 在单纯的用户级线程实现方式中,在单纯的用户级线程实现方式中,多线程应用不能多线程应用不能利用多处理机进行多重处理的优点利用多处理机进行多重处理的优点内核每次分配给一个进内核每次分配给一个进程的仅有一个程的仅有一个CPU,因此进程中仅有一个线程能执行,在该,因此进程中仅有一个线程能执行,在该线程放弃线程放弃CPU之前,其它线程只能等待之前,其它线程只能等待 第二章 进 程 管 理     3.组合方式.组合方式    有些操作系统把用户级线程和内核支持线程两种方式进有些操作系统把用户级线程和内核支持线程两种方式进行组合,提供了组合方式行组合,提供了组合方式ULT/KST 线程在组合方式线程系在组合方式线程系统中,内核支持多统中,内核支持多KST线程的建立、调度和管理,同时,也线程的建立、调度和管理,同时,也允许用户应用程序建立、调度和管理用户级线程允许用户应用程序建立、调度和管理用户级线程 一些内核支持线程对应多个用户级线程,一些内核支持线程对应多个用户级线程,程序员可按应程序员可按应用需要和机器配置对内核支持线程数目进行调整,以达到较用需要和机器配置对内核支持线程数目进行调整,以达到较好的效果好的效果。

      组合方式线程中,同一个进程内的多个线程可以组合方式线程中,同一个进程内的多个线程可以同时在多处理器上并行执行,而且在阻塞一个线程时,并不同时在多处理器上并行执行,而且在阻塞一个线程时,并不需要将整个进程阻塞所以,组合方式多线程机制能够结合需要将整个进程阻塞所以,组合方式多线程机制能够结合KST和和ULT两者的优点,并克服了其各自的不足两者的优点,并克服了其各自的不足 第二章 进 程 管 理 2.6.4 线程的实现 线程的实现    1.内核支持线程的实现.内核支持线程的实现  在仅设置了内核支持线程的 在仅设置了内核支持线程的OS中,一种可能的线程控制中,一种可能的线程控制方法是,系统在创建一个新进程时,便为它分配一个任务数方法是,系统在创建一个新进程时,便为它分配一个任务数据区据区PTDA(Per Task Data Area),其中包括若干个线程控制块,其中包括若干个线程控制块TCB空间,如图空间,如图2-15所示在每一个所示在每一个TCB中可保存线程标识中可保存线程标识符、优先级、线程运行的符、优先级、线程运行的CPU状态等信息虽然这些信息与状态等信息虽然这些信息与用户级线程用户级线程TCB中的信息相同,但现在却是被保存在内核空中的信息相同,但现在却是被保存在内核空间中。

      间中 第二章 进 程 管 理 图 2-15 任务数据区空间 第二章 进 程 管 理   每当进程要创建一个线程时,便为新线程分配一个  每当进程要创建一个线程时,便为新线程分配一个TCB,将有关信息填入该,将有关信息填入该TCB中,并为之分配必要的资源,如为中,并为之分配必要的资源,如为线程分配数百至数千个字节的栈空间和局部存储区,于是新线程分配数百至数千个字节的栈空间和局部存储区,于是新创建的线程便有条件立即执行当创建的线程便有条件立即执行当PTDA中的所有中的所有TCB空间已空间已用完,而进程又要创建新的线程时,只要其所创建的线程数用完,而进程又要创建新的线程时,只要其所创建的线程数目未超过系统的允许值目未超过系统的允许值(通常为数十至数百个通常为数十至数百个),系统可再为之,系统可再为之分配新的分配新的TCB空间;在撤消一个线程时,也应回收该线程的空间;在撤消一个线程时,也应回收该线程的所有资源和所有资源和TCB可见,内核支持线程的创建、可见,内核支持线程的创建、 撤消均与进撤消均与进程的相类似在有的系统中为了减少创建和撤消一个线程时程的相类似在有的系统中为了减少创建和撤消一个线程时的开销,在撤消一个线程时,并不立即回收该线程的资源和的开销,在撤消一个线程时,并不立即回收该线程的资源和TCB,当以后再要创建一个新线程时,便可直接利用已被撤,当以后再要创建一个新线程时,便可直接利用已被撤消但仍保持有资源和消但仍保持有资源和TCB的线程作为新线程。

      的线程作为新线程 第二章 进 程 管 理   内核支持线程的调度和切换与进程的调度和切换十分相似,  内核支持线程的调度和切换与进程的调度和切换十分相似,也分抢占式方式和非抢占方式两种也分抢占式方式和非抢占方式两种 程的调度算法上,同样可采用时间片轮转法、优先权程的调度算法上,同样可采用时间片轮转法、优先权算法等当线程调度选中一个线程后,便将处理机分配给它当线程调度选中一个线程后,便将处理机分配给它当然,线程在调度和切换上所花费的开销,要比进程的小得多当然,线程在调度和切换上所花费的开销,要比进程的小得多 第二章 进 程 管 理     2.用户级线程的实现.用户级线程的实现    用用户户级级线线程程是是在在用用户户空空间间实实现现的的所所有有的的用用户户级级线线程程都都具具有有相相同同的的结结构构,,它它们们都都运运行行在在一一个个中中间间系系统统的的上上面面当当前前有有两两种方式实现的中间系统,即运行时系统和内核控制线程种方式实现的中间系统,即运行时系统和内核控制线程    1) 运行时系统运行时系统(Runtime System)    所谓所谓“运行时系统运行时系统”,实质上是用于管理和控制线程的函,实质上是用于管理和控制线程的函数数(过程过程)的集合,的集合,其中包括用于创建和撤消线程的函数、其中包括用于创建和撤消线程的函数、 线程线程同步和通信的函数以及实现线程调度的函数等。

      同步和通信的函数以及实现线程调度的函数等 正因为有这些函数,才能使用户级线程与内核无关运行正因为有这些函数,才能使用户级线程与内核无关运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口内核之间的接口 第二章 进 程 管 理   在传统的  在传统的OS中,进程在切换时必须先由用户态转为核心中,进程在切换时必须先由用户态转为核心态,再由核心来执行切换任务;态,再由核心来执行切换任务; 而用户级线程在切换时则不而用户级线程在切换时则不需转入核心态,而是由需转入核心态,而是由运行时系统运行时系统中的线程切换过程来执行中的线程切换过程来执行切换任务切换任务 该过程将线程的该过程将线程的CPU状态保存在该线程的堆栈中,然后按状态保存在该线程的堆栈中,然后按照一定的算法选择一个处于就绪状态的新线程运行,将新线照一定的算法选择一个处于就绪状态的新线程运行,将新线程堆栈中的程堆栈中的CPU状态装入到状态装入到CPU相应的寄存器中,一旦将栈相应的寄存器中,一旦将栈指针和程序计数器切换后,便开始了新线程的运行。

      由于用指针和程序计数器切换后,便开始了新线程的运行由于用户级线程的切换无需进入内核,且切换操作简单,因而使用户级线程的切换无需进入内核,且切换操作简单,因而使用户级线程的切换速度非常快户级线程的切换速度非常快 第二章 进 程 管 理   不论在传统的  不论在传统的OS中,还是在多线程中,还是在多线程OS中,系统资源都中,系统资源都是由内核管理的是由内核管理的 在传统的在传统的OS中,进程是利用中,进程是利用OS提供的系统调用来请求提供的系统调用来请求系统资源的,系统调用通过软中断系统资源的,系统调用通过软中断(如如trap)机制进入机制进入OS内核,内核,由内核来完成相应资源的分配由内核来完成相应资源的分配 用户级线程是不能利用系统调用的当线程需要系统资用户级线程是不能利用系统调用的当线程需要系统资源时,是将该要求传送给运行时系统,由后者通过相应的系源时,是将该要求传送给运行时系统,由后者通过相应的系统调用来获得系统资源的统调用来获得系统资源的 第二章 进 程 管 理     2) 内核控制线程内核控制线程  这种线程又称为轻型进程  这种线程又称为轻型进程LWP(Light Weight Process)。

      每一个进程都可拥有多个每一个进程都可拥有多个LWP,同用户级线程一样,每个,同用户级线程一样,每个LWP都有自己的数据结构都有自己的数据结构(如如TCB),其中包括线程标识符、优,其中包括线程标识符、优先级、状态,另外还有栈和局部存储区等先级、状态,另外还有栈和局部存储区等 它们也可以共享进程所拥有的资源它们也可以共享进程所拥有的资源LWP可通过系统调可通过系统调用来获得内核提供的服务,这样,用来获得内核提供的服务,这样,当一个用户级线程运行时,当一个用户级线程运行时,只要将它连接到一个只要将它连接到一个LWP上,此时它便具有了内核支持线程上,此时它便具有了内核支持线程的所有属性的所有属性这种线程实现方式就是组合方式这种线程实现方式就是组合方式 第二章 进 程 管 理   在一个系统中的用户级线程数量可能很大,为了节省系  在一个系统中的用户级线程数量可能很大,为了节省系统开销,不可能设置太多的统开销,不可能设置太多的LWP,而把这些,而把这些LWP做成一个缓做成一个缓冲池,称为冲池,称为“线程池线程池” 用户进程中的任一用户线程都可以连接到用户进程中的任一用户线程都可以连接到LWP池中的任池中的任何一个何一个LWP上。

      为使每一用户级线程都能利用上为使每一用户级线程都能利用LWP与内核通与内核通信,可以使多个用户级线程多路复用一个信,可以使多个用户级线程多路复用一个LWP,但只有当前,但只有当前连接到连接到LWP上的线程才能与内核通信,其余进程或者阻塞,上的线程才能与内核通信,其余进程或者阻塞,或者等待或者等待LWP 第二章 进 程 管 理   而每一个  而每一个LWP都要连接到一个内核级线程上,这样,通都要连接到一个内核级线程上,这样,通过过LWP可把用户级线程与内核线程连接起来,用户级线程可可把用户级线程与内核线程连接起来,用户级线程可通过通过LWP来访问内核,但内核所看到的总是多个来访问内核,但内核所看到的总是多个LWP而看不而看不到用户级线程到用户级线程 亦即,由亦即,由LWP实现了在内核与用户级线程之间的隔离,实现了在内核与用户级线程之间的隔离,从而使用户级线程与内核无关从而使用户级线程与内核无关 图图2-16示出了利用轻型进程作为中间系统时用户级线程示出了利用轻型进程作为中间系统时用户级线程的实现方法的实现方法 第二章 进 程 管 理 图 2-16 利用轻型进程作为中间系统 第二章 进 程 管 理   当用户级线程不需要与内核通信时,并不需要  当用户级线程不需要与内核通信时,并不需要LWP;而;而当要通信时,便需借助于当要通信时,便需借助于LWP,而且每个要通信的用户级线,而且每个要通信的用户级线程都需要一个程都需要一个LWP。

      例如,在一个任务中,如果同时有例如,在一个任务中,如果同时有5个用户级线程发出了个用户级线程发出了对文件的读、写请求,这就需要有对文件的读、写请求,这就需要有5个个LWP来予以帮助,即由来予以帮助,即由LWP将对文件的读、写请求发送给相应的内核级线程,再由将对文件的读、写请求发送给相应的内核级线程,再由后者执行具体的读、写操作后者执行具体的读、写操作 如果一个任务中只有如果一个任务中只有4个个LWP,则只能有,则只能有4个用户级线程个用户级线程的读、写请求被传送给内核线程,余下的一个用户级线程必的读、写请求被传送给内核线程,余下的一个用户级线程必须等待 第二章 进 程 管 理   在内核级线程执行操作时,如果发生阻塞,则与之相连  在内核级线程执行操作时,如果发生阻塞,则与之相连接的多个接的多个LWP也将随之阻塞,进而使连接到也将随之阻塞,进而使连接到LWP上的用户级上的用户级线程也被阻塞如果进程中只包含了一个线程也被阻塞如果进程中只包含了一个LWP,此时进程也,此时进程也应阻塞 这种情况与前述的传统这种情况与前述的传统OS一样,在进程执行系统调用时,一样,在进程执行系统调用时,该进程实际上是阻塞的。

      该进程实际上是阻塞的 但如果在一个进程中含有多个但如果在一个进程中含有多个LWP,则当一个,则当一个LWP阻塞阻塞时,进程中的另一个时,进程中的另一个LWP可继续执行;即使进程中的所有可继续执行;即使进程中的所有LWP全部阻塞,进程中的线程也仍然能继续执行,只是不能全部阻塞,进程中的线程也仍然能继续执行,只是不能再去访问内核再去访问内核 第二章 进 程 管 理     3.用户级线程与内核控制线程的连接.用户级线程与内核控制线程的连接    1) 一对一模型一对一模型    该该模模型型是是为为每每一一个个用用户户线线程程都都设设置置一一个个内内核核控控制制线线程程与与之之连连接接,,当当一一个个线线程程阻阻塞塞时时,,允允许许调调度度另另一一个个线线程程运运行行在在多处理机系统中,则有多个线程并行执行多处理机系统中,则有多个线程并行执行  该模型并行能力较强,但每创建一个用户线程相应地就  该模型并行能力较强,但每创建一个用户线程相应地就需要创建一个内核线程,开销较大,因此需要限制整个系统需要创建一个内核线程,开销较大,因此需要限制整个系统的线程数的线程数Windows 2000、、Windows NT、、OS/2等系统上都等系统上都实现了该模型。

      实现了该模型 第二章 进 程 管 理     2) 多对一模型多对一模型    该该模模型型是是将将多多个个用用户户线线程程映映射射到到一一个个内内核核控控制制线线程程,,为为了了管管理理方方便便,,这这些些用用户户线线程程一一般般属属于于一一个个进进程程,,运运行行在在该该进进程程的的用用户户空空间间,,对对这这些些线线程程的的调调度度和和管管理理也也是是在在该该进进程程的的用用户户空空间间中中完完成成当当用用户户线线程程需需要要访访问问内内核核时时,,才才将将其其映映射射到到一个内核控制线程上,但每次只允许一个线程进行映射一个内核控制线程上,但每次只允许一个线程进行映射  该模型的主要优点是线程管理的开销小,效率高,但当  该模型的主要优点是线程管理的开销小,效率高,但当一个线程在访问内核时发生阻塞,则整个进程都会被阻塞,一个线程在访问内核时发生阻塞,则整个进程都会被阻塞,而且在多处理机系统中,一个进程的多个线程无法实现并行而且在多处理机系统中,一个进程的多个线程无法实现并行 第二章 进 程 管 理     3) 多对多模型多对多模型    该该模模型型结结合合上上述述两两种种模模型型的的优优点点,,将将多多个个用用户户线线程程映映射射到到多多个个内内核核控控制制线线程程,,内内核核控控制制线线程程的的数数目目可可以以根根据据应应用用进进程程和和系系统统的的不不同同而而变变化化,,可可以以比比用用户户线线程程少少,,也也可可以以与与之之相相同。

      点击阅读更多内容
      相关文档
      【全国硕士研究生入学统一考试政治】2020年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2015年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2010年考研政治真题.docx 【全国硕士研究生入学统一考试政治】1996年政治考研真题(理科)及参考答案.doc 【全国硕士研究生入学统一考试政治】2001年政治考研真题(理科)及参考答案.doc 【全国硕士研究生入学统一考试政治】2016年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2000年政治考研真题(文科)及参考答案.doc 【全国硕士研究生入学统一考试政治】1997年政治考研真题(理科)及参考答案.doc 【全国硕士研究生入学统一考试政治】2007年考研政治真题.doc 【全国硕士研究生入学统一考试政治】1997年政治考研真题(文科)及参考答案.doc 【全国硕士研究生入学统一考试政治】2004年考研政治真题.doc 【全国硕士研究生入学统一考试政治】2003年考研政治真题.doc 【全国硕士研究生入学统一考试政治】2019年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2009年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2001年政治考研真题(文科)及参考答案.doc 【全国硕士研究生入学统一考试政治】2021年考研政治真题.doc 【全国硕士研究生入学统一考试政治】2014年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2018年考研政治真题.docx 【全国硕士研究生入学统一考试政治】2008年考研政治真题.doc 【全国硕士研究生入学统一考试政治】2011年考研政治真题.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.