进程通信PPT课件

上传人:m**** 文档编号:569519219 上传时间:2024-07-30 格式:PPT 页数:85 大小:890KB
返回 下载 相关 举报
进程通信PPT课件_第1页
第1页 / 共85页
进程通信PPT课件_第2页
第2页 / 共85页
进程通信PPT课件_第3页
第3页 / 共85页
进程通信PPT课件_第4页
第4页 / 共85页
进程通信PPT课件_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《进程通信PPT课件》由会员分享,可在线阅读,更多相关《进程通信PPT课件(85页珍藏版)》请在金锄头文库上搜索。

1、1第四第四章章 进程通进程通信信操作系统操作系统 陆松年松年 24.14.1进程的同步与互斥程的同步与互斥4.1.1 同步与互斥的概念同步与互斥的概念 两个或两个以上的进程要协作完成一个任两个或两个以上的进程要协作完成一个任务,它们之间就要互相配合,需要在某些务,它们之间就要互相配合,需要在某些动作之间进行同步。动作之间进行同步。 进程间另一种关系是互斥,这种关系一进程间另一种关系是互斥,这种关系一般发生在两个或两个以上的进程竞争某些般发生在两个或两个以上的进程竞争某些同时只能被一个进程使用的资源的情况下。同时只能被一个进程使用的资源的情况下。34.1.2 临界段问题临界段问题在一段在一段时

2、间内只能允内只能允许一个一个进程程访问的的资源称源称为临界界资源源,如打印机、,如打印机、磁磁带机、光机、光盘刻写机、刻写机、绘图仪等等进程程执行的行的访问临界界资源的程序段称源的程序段称为临界段界段或或互斥段互斥段。临界资源与临界段临界资源与临界段4 统计两个进程统计两个进程 P1P1和和P2P2对共享对共享变量变量countcount访问计数:访问计数:P1P1: : : P2P2:: : R1=count R1=count (0 0) R2=countR2=count(1 1) R1=R1+1 R1=R1+1 R2=R2+1R2=R2+1 count=R1 count=R1 (1 1)

3、count=R2count=R2 (2 2) : : : :结果:果:count2设设count初值初值05两个进程可能的相对执行次序两个进程可能的相对执行次序P1:R1=count (0 0) R1=R1+1 (1 1) P2:R2=count (0 0) R2=R2+1 (1 1) count=R2 (1 1) P1:count=R1 (1 1)虽然然P1和和P2进程各自都程各自都执行了行了对count加加1 1的操的操作段,但作段,但结果果count只增加只增加1 1。因此,因此,变量量count就是就是临界界资源,源,P1、P2访问count的两个程序段就是的两个程序段就是临界段,界段

4、,诸进程必程必须互互斥地斥地进入入临界段。界段。64.2 进程间互斥控制方进程间互斥控制方法法 锁可以用于控制临界段的互斥执行。锁有锁可以用于控制临界段的互斥执行。锁有两个状态,一个是打开状态,另一个是关闭状两个状态,一个是打开状态,另一个是关闭状态,故锁可以用布尔变量表示。在态,故锁可以用布尔变量表示。在C中,锁变中,锁变量可以定义为量可以定义为char或或int类型变量。设类型变量。设x为锁变为锁变量,则定义:量,则定义: x = 0 锁的打开状态;锁的打开状态;1 锁的关闭状态。锁的关闭状态。4.2.1 锁的表示和操作锁的表示和操作7v当当进程希望程希望进入入临界段界段时,首先要,首先要

5、测试锁的状的状态,如,如锁是打开的,表示是打开的,表示无无进程程处于于临界段,那么可以关界段,那么可以关闭该锁,并,并进入入临界段。界段。v当当该进程程处于于临界段界段时,其他,其他试图进入入临界段的界段的进程由于在程由于在测试锁的状的状态时发现它它处于关于关闭状状态,就只能在,就只能在临界段外等待。界段外等待。用锁变量控制临界段的执行用锁变量控制临界段的执行8用锁操作控制进程对临界段的互斥执行用锁操作控制进程对临界段的互斥执行 (a)LOCK (x) x=0 ?x=1临临界界段段+-UNLOCK (x)临临界界段段 x=0 (b)94.2.2 锁的安全控制锁的安全控制锁的关的关闭操作操作LO

6、CK包括包括测试和关和关闭两个操作步两个操作步骤,这两个操作步两个操作步骤涉及涉及临界界资源源x,故故这段程序也是段程序也是临界段。界段。假定假定锁是打开的,当一个是打开的,当一个进程程P1在在测试锁的状的状态后,后,还没来得及关没来得及关闭它的它的一瞬一瞬间,发生了中断;生了中断;中断返回中断返回时,系,系统可能可能调度另一个度另一个进程程P2执行。行。P2执行行时也也对该锁的状的状态进行行测试,发觉它它处于打开状于打开状态,于是关,于是关闭该锁,并,并进入入临界段。那么两个界段。那么两个进程就同程就同时处于一个于一个临界段之中。界段之中。101. 测试并设置指令测试并设置指令test&se

7、t有些有些计算机提供算机提供专门的的锁操作指令操作指令test&set,该指令首先指令首先测试锁变量的量的值,如,如为1 1,则重复重复执行本指令;如行本指令;如为0 0,则立即将立即将锁变量的量的值置置为1 1。由于由于test&set是一条完整的指令,而在一条指令的是一条完整的指令,而在一条指令的执行中行中间是不会被中断的,故保是不会被中断的,故保证了了锁的的测试和关和关闭操作的操作的连续性。性。112. 交换指令交换指令用用8086指令实现锁操作指令实现锁操作check:MOV AL, 1 ;置测试单元寄存器置测试单元寄存器AL的值为的值为1LOCK XCHG X, AL ;在本指令的执

8、行时在本指令的执行时封锁总线,封锁总线, ;交换锁变量交换锁变量X与测试与测试单元的值单元的值TEST AL, AL ;测试测试AL的值的值JNZ check ;如如AL非非0,即原锁处于,即原锁处于关闭状态,关闭状态,: ;跳转至;跳转至check,重复测试过程重复测试过程临界段临界段 ;锁变;锁变量量X已置为已置为1123. 开、关中断法开、关中断法1 1)这种方法只能用于种方法只能用于单CPU系系统。2 2)如果如果临界段操作比界段操作比较复复杂,执行行时间较长,那么,那么长时间地关地关闭中断会降低系中断会降低系统对外部中断响外部中断响应的速度,影响系的速度,影响系统处理理紧迫事迫事件的

9、能力;件的能力; 3 3)采用开、关中断的硬件采用开、关中断的硬件锁方法方法禁止了其他无关的禁止了其他无关的进程程进入不同入不同的的临界段,界段,这种做法种做法显然然伤害了害了很多的很多的“无辜者无辜者”。 关关中断中断 临临界界区区 开开中断中断134. 用硬件锁锁软件锁,用软件锁锁临界段用硬件锁锁软件锁,用软件锁锁临界段软件件锁的的LOCK操作包括操作包括测试和关和关闭两个操作步两个操作步骤,它本身,它本身也是一种也是一种临界段,故可以用硬界段,故可以用硬件件锁开、关中断保开、关中断保证软件件锁操作的完整性。操作的完整性。 由于由于软件件锁是一种程序是一种程序长度最度最短的短的临界段,故用

10、开、关中断界段,故用开、关中断的方法保的方法保证锁操作的完整性几操作的完整性几乎不会影响到系乎不会影响到系统响响应其他的其他的中断中断请求。求。用用软件件锁保保证临界段界段执行的独行的独占性,不会影响到其他无关占性,不会影响到其他无关进程程进入不同的入不同的临界段,界段,这是一是一种安全而高效的种安全而高效的锁。LOCK(x) 关中断关中断 开中断开中断 x=0? + x=1 开中断开中断 临界段临界段图图4-3 复合复合锁的操作锁的操作流程流程144.3 信号灯和信号灯和semWait、semSignal操作操作信号灯定信号灯定义成具有整型成具有整型值,并能,并能对其施加以下三其施加以下三种

11、操作的种操作的变量,除了量,除了这三种操作之外的任何操作都三种操作之外的任何操作都不能不能测试和和处理信号灯的理信号灯的值。(1 1)初始化操作,信号灯能初始化)初始化操作,信号灯能初始化为非非负的的值。(2 2)semWait操作操作,能减小信号灯的能减小信号灯的值,如,如结果果值为负,执行行semWait操作的操作的进程就被封程就被封锁。(3 3)semSignal操作操作,能增加信号灯的能增加信号灯的值,如果,如果结果果值非正,那么原先因非正,那么原先因执行行semWait操作而阻塞操作而阻塞的的进程被解除阻塞。程被解除阻塞。15semWait、semSignal操作两个原语定义操作两个

12、原语定义typedef struct semaphore int value ; Queue queue; Semaphore ;Semaphore s;16void semSignal(s)semaphores;if ( +s.value = 0 ) 从等待队列从等待队列queue中移出一进程;中移出一进程;将该进程置入将该进程置入就绪队列中;就绪队列中;void semWait(s)semaphores ;if ( -s.value 0 ) 将进程置入等待将进程置入等待队列队列queue中;中;封锁进程;封锁进程;转进程调度程序;转进程调度程序;174.4 信号灯的应信号灯的应用用4.4.

13、1 利用信号灯实现互斥利用信号灯实现互斥置信号灯置信号灯s的初值为的初值为1 P1 Pi PnsemWait(s) semWait (s) semWait (s) 临界段临界段临界临界段段 临界段临界段 semSignal(s) semSignal(s) semSignal (s)图图4-4 信号灯用于进程间互斥信号灯用于进程间互斥18信号灯的所有可能取信号灯的所有可能取值及意及意义为:s = 1 1无无进程程进入入临界段界段0 0 有一有一进程程进入入临界段界段-1-1 有一有一进程程进入入临界段,界段,另一另一进程被阻塞程被阻塞如有如有n个并个并发进程涉及一个程涉及一个临界段,界段,则上式

14、最后一行上式最后一行s的取的取值为i, -(n-1)-(n-1) i-1i-1,表示当前有表示当前有| |i|i|个个进程被阻塞。程被阻塞。两个并发进程涉及一个临界段两个并发进程涉及一个临界段194.4.2 4.4.2 阻塞阻塞唤醒协议唤醒协议置信号灯置信号灯s的初值为的初值为0 Pa Pb 计算计算func1( ) 计算计算func2( )L1:semWait(s) 将计算结果存入缓冲区将计算结果存入缓冲区获得获得Pb的计算结果的计算结果 L2:semSignal(s) 计算乘积计算乘积 : :图图4-5 阻塞阻塞唤醒协议唤醒协议的实现的实现20从从图中可以看出,当中可以看出,当进程程a a

15、执行到行到L1L1点点时,如,如进程程b b还未未执行到行到L2L2点,也即点,也即func2func2函数的函数的计算算还未完成,未完成,进程程a a就要同步等待就要同步等待进程程b b。而而进程程b b则不必同步等待不必同步等待进程程a a,所以所以说这种同步是非种同步是非对称的,称的,或可以称或可以称为“半同步半同步”。214.4.3 两个进程间的同步两个进程间的同步 1. 一个全同步的例子一个全同步的例子 设有两个进程设有两个进程Pa和和Pb。进程进程Pa每次执行每次执行一个计算,并将结果存入一个缓冲区;一个计算,并将结果存入一个缓冲区; 进程进程Pb则从缓冲区中取出结果,并将结则从缓

16、冲区中取出结果,并将结果打印出来。果打印出来。22为了了实现计算算进程和打印程和打印进程之程之间的相互同步,就需要的相互同步,就需要设置置2 2个信号量个信号量S1和和S2。 在在semWait、semSignal操作之前两个信号量的含操作之前两个信号量的含义为:S1表示表示缓冲冲区中是否已存入区中是否已存入进程程Pa的的计算算结果,也即通知果,也即通知进程程Pb是否可取出是否可取出缓冲区冲区中的信息并送往打印机。中的信息并送往打印机。S1值为:0 0:Pa没存入新的没存入新的计算算结果果11:Pa已存入新的已存入新的计算算结果果23 S2:表示表示缓冲区中的冲区中的结果是否已被果是否已被进程

17、程Pb取去,也即通知取去,也即通知进程程Pa是否可将新的是否可将新的计算算结果再存入果再存入缓冲区。冲区。 S2的的值为:00:Pb没取走没取走缓冲区中的数据,冲区中的数据,缓冲区冲区满11:Pb已取走已取走缓冲区中的数据,冲区中的数据,缓冲区空冲区空24信号灯的初信号灯的初值可可设置置为:S1为0 0:缓冲区冲区还未存入数据未存入数据 S2为1 1:缓冲空冲空闲(相当于(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2)

18、 semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)25信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)226

19、信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)23(0)27信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲

20、空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)23(0)428信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb compu

21、ting semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)23(0)45(0)29信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (resu

22、lt) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)2, 63(0)45(0)30信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-

23、6 两个进程之间的全同步两个进程之间的全同步1(-1)2, 63(0), 7(-1)45(0)31信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)2, 63(0), 7(-1

24、)45(0)832信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)2, 63(0), 7(-1)45(0)89(0)33信号灯的初值可设置为:信号灯的初值可设置为: S1为为

25、0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1)2, 63(0), 7(-1)45(0)89(0)1034信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当

26、于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1), 11(-1)2, 63(0), 7(-1)45(0)89(0)1035信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算

27、进程计算进程Pa打印进程打印进程Pb computing semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1), 11(-1)2, 63(0), 7(-1)4, 125(0)89(0)1036信号灯的初值可设置为:信号灯的初值可设置为: S1为为0:缓冲区还未存入数据缓冲区还未存入数据 S2为为1:缓冲空闲(相当于缓冲空闲(相当于Pb已取走数据)已取走数据) 计算进程计算进程Pa打印进程打印进程Pb com

28、puting semWait(s1) semWait(s2) get (result) put (result) semSignal(s2) semSignal(s1) printing图图 4-64-6 两个进程之间的全同步两个进程之间的全同步1(-1), 11(-1)2, 63(0), 7(-1)4, 125(0)89(0)10372.互斥和同步对信号灯操作方法的差异互斥和同步对信号灯操作方法的差异互斥和同步都是通互斥和同步都是通过对信号灯的信号灯的semWait、semSignal操作来操作来实现的,但的,但这两种控制机制两种控制机制对信号信号灯的操作策略是不同的。灯的操作策略是不同的。

29、互斥互斥实现是不同的是不同的进程程对同一信号灯同一信号灯进行行semWait、semSignal 操作,一个操作,一个进程在成功地程在成功地对信号灯信号灯执行了行了semWait操作后操作后进入入临界段,并在退出界段,并在退出临界段后,由界段后,由该进程本身程本身对这信号灯信号灯执行行semSignal操作,表示没操作,表示没有有进程程处于于临界段,可界段,可让其他其他进程程进入。入。同步的同步的实现由一个由一个进程程Pa对一个信号灯一个信号灯进行行semWait操作后,只能由另一个操作后,只能由另一个进程程Pb对同一个信号灯同一个信号灯进行行semSignal操作,使操作,使Pa能能继续前前

30、进,在,在这种情况下,种情况下,进程程Pa要同步等待要同步等待Pb。如如进程程Pb也要同步等待也要同步等待Pa,则要要设置另一个信号灯。置另一个信号灯。384.4.4 生产者和消费者问题生产者和消费者问题生生产者和消者和消费者者问题是通是通过有限的有限的缓冲区(冲区(仓库)将一群生将一群生产者者P1, P2P1, P2PkPk和一群消和一群消费者者C1,C2C1,C2CmCm联系起来。可系起来。可设信号量信号量buffersbuffers的初的初值为n n,表示空表示空闲的的缓冲区数目。冲区数目。productsproducts的初的初值为0 0,表示已存入,表示已存入缓冲区的冲区的产品品数目

31、。数目。生生产者和消者和消费者者问题的一般的一般过程程为:生:生产者在者在执行行semWait(buffers)semWait(buffers)之后,只要之后,只要buffers0(buffers0(还有空有空闲的的缓冲区冲区) ),就可将,就可将产品送入。消品送入。消费者在者在执行行semWait(products)semWait(products)后,只要后,只要products0products0( (产品品还未取完未取完) ),就可以从,就可以从缓冲区中取走冲区中取走产品,品,并消并消费之。否之。否则,生,生产者或消者或消费者者进程就被阻塞。程就被阻塞。39 producers: cu

32、stomers:producers: customers: while ( ) while ( ) produce next product; semWait (products); semWait (buffers); get product from buffers; Put product into buffers; semSignal (buffers) semSignal (products);consume product; 40 producers: customers:producers: customers: while ( ) while ( ) produce next

33、product; semWait (products); semWait (buffers); semWait (mutex); semWait (mutex); get product from buffers; Put product into buffers; semSignal (mutex); semSignal (mutex); semSignal (buffers) semSignal (products);consume product; 请请仔仔细细推推敲敲semWait、semSignal操操作作的的次次序序。这这些些操操作作的的次次序序安安排排得得不不合合理理,就就有有可

34、可能能发发生生“死死锁锁”。414.4.5 读者读者写者问题写者问题 常会有若干个并常会有若干个并发进程程对数据数据对象象进行行读写的情写的情况。有些况。有些进程只要求程只要求读数据数据对象,有些象,有些进程程则要要求修改数据求修改数据对象。象。若干个若干个读者可以同者可以同时访问数据数据对象,不需要互斥象,不需要互斥也不会也不会产生任何生任何问题,但一个写者不能与任何的,但一个写者不能与任何的读者或者写者同者或者写者同时访问数据数据对象,否象,否则就可能破就可能破坏数据坏数据对象的完整性、正确性与一致性。象的完整性、正确性与一致性。可将所有的可将所有的读进程看成是一程看成是一类的,但写的,但

35、写进程必程必须和任何其他的写和任何其他的写进程和程和读进程程类互斥。互斥。42当有当有读进程正在程正在访问数据数据对象象时,读进程的个数程的个数与互斥要求没有关系。只有当第一个与互斥要求没有关系。只有当第一个读进程需要程需要对数据数据对象象访问时,才需要,才需要执行行semWait操作,操作,以判断是否有写以判断是否有写进程正在更新数据程正在更新数据对象。象。只有当最后一个只有当最后一个读进程退出程退出访问数据数据对象的象的临界界段段时,才需要,才需要执行行semSignal操作,以便拆除操作,以便拆除“路路障障”,让一个写一个写进程程进入。入。需要需要设置一个跟踪正在置一个跟踪正在临界段界段

36、访问数据数据对象的象的读进程个数的全局共享程个数的全局共享变量量count。由于由于该计数器也数器也是一个是一个临界界资源,所以源,所以诸进程程对它的它的访问也也应当当互斥地互斥地进行,行,为此,此,还要要设置另外一个互斥信号置另外一个互斥信号灯。灯。43解决读者解决读者写者问题的算法写者问题的算法 信号灯初值:信号灯初值:mutex 为为1 wrt为为1 计数器变量:计数器变量:int count = 0 writors: while ( ) semWait(wrt); write information semSignal(wrt); 44 readers:while ( ) semWai

37、t(mutex); if( +count = 1) semWait(wrt); semSignal(mutex); Read information; semWait(mutex); if ( -count = 0 ) semSignal(wrt); semSignal(mutex);454.5 进程间的数据通信进程间的数据通信4.5.1 消息通信消息通信v 消消息息通通信信的的基基本本思思想想是是由由系系统统的的消消息息通通信信机构统一管理一组空闲的消息缓冲区。机构统一管理一组空闲的消息缓冲区。v 一一个个进进程程要要向向另另一一个个进进程程发发送送消消息息,先先要要向向系系统统申申请请一一

38、个个缓缓冲冲区区,填填写写了了消消息息正正文文和和其其他他有有关关消消息息的的特特征征、控控制制信信息息后后,通通过过消消息息通通信信机机构构将将该该消消息送到接收其他消息队列中。息送到接收其他消息队列中。v 接接收收进进程程在在一一个个适适当当时时机机从从消消息息队队列列中中移移出出一一个消息,读取所有的信息后,再释放消息缓冲区个消息,读取所有的信息后,再释放消息缓冲区。v 一一个个消消息息缓缓冲冲区区的的数数据据结结构构中中除除了了要要包包括括消息的正文外,一般还要包括其他有关的控制信息。消息的正文外,一般还要包括其他有关的控制信息。46send_pid:发送送进程程标识type:消息消息

39、类型型size:消息消息长度度next_ptr:下一个消息的指下一个消息的指针text :消息正文消息正文为了支持消息通信,在了支持消息通信,在进程控制程控制PCB中中还要要增增设有关管理消息的成有关管理消息的成员,如:,如:hd_ptr : 进程已收到消息的程已收到消息的队列首指列首指针mutex :对消息消息队列列进行操作的互斥信号灯行操作的互斥信号灯ssm :接收接收进程和程和发送送进程之程之间的同步信的同步信号灯,其号灯,其值表示接收表示接收进程消息程消息队列列中的消中的消息数。息数。47发送送进程在程在发送消息之前,先要在送消息之前,先要在进程自己的内程自己的内存空存空间中开辟一个中

40、开辟一个发送送缓冲区,将消息正文及有冲区,将消息正文及有关控制信息填入其中,再关控制信息填入其中,再调用用发送消息的系送消息的系统调用用msgsnd(sm_ptr),其中参数其中参数sm-ptr指向指向进程程的的发送送缓冲区始址。冲区始址。接收接收进程在接收消息之前,也先要在程在接收消息之前,也先要在进程自己的程自己的内存空内存空间中开辟一个接收中开辟一个接收缓冲区,再冲区,再调用接收消用接收消息的系息的系统调用用msgrcv(rm_ptr),其中参数其中参数rm_ptr指向接收指向接收缓冲区始址。冲区始址。msgsnd和和msgrcv系统调用系统调用484.5.2 共享存储区共享存储区共享存

41、共享存储区机制可以把内存中的一个区域区机制可以把内存中的一个区域连入多入多个个进程的虚地址空程的虚地址空间,当一个,当一个进程程对该地址空地址空间写入数据后,另一个写入数据后,另一个进程就可以从自己所程就可以从自己所连入的入的虚地址空虚地址空间直接直接读出共享存出共享存储区中的数据,就如区中的数据,就如同同进程存取自己的私有数据一程存取自己的私有数据一样方便。方便。进程要求分配一个共享存程要求分配一个共享存储区区时,核心先要按,核心先要按进程提供的关程提供的关键字字值查找系找系统的共享存的共享存储区段表,区段表,如已存在指定关如已存在指定关键字的共享段,字的共享段,则说明明该共享段共享段已先由

42、其他已先由其他进程程创建,只要建,只要权限允限允许,可,可简单地地返回返回该表表项的描述符。的描述符。49共享存储区(续)共享存储区(续)n如未找到指定关键字的表项,系统就根据进程对如未找到指定关键字的表项,系统就根据进程对共享存储区的大小及存取控制权的要求,分配一共享存储区的大小及存取控制权的要求,分配一个空闲的页表区和空闲的内存块,在共享存储区个空闲的页表区和空闲的内存块,在共享存储区段表中填入共享段的关键字、大小、共享段的页段表中填入共享段的关键字、大小、共享段的页表始址及存取控制权等信息,并返回该表项的描表始址及存取控制权等信息,并返回该表项的描述符。述符。n接下来进程就可以通过该共享

43、存储区的描述字,接下来进程就可以通过该共享存储区的描述字,将共享存储段映射到进程的虚地址空间。将共享存储段映射到进程的虚地址空间。504.5.3 管道通信管道通信管道是一种信息流管道是一种信息流缓冲机构,它用于冲机构,它用于连接接发送送进程和接收程和接收进程,以程,以实现它它们之之间的数据通信。管的数据通信。管道以先入先出(道以先入先出(FIFO)的方式的方式组织数据的数据的传输。在在发送送进程和接收程和接收进程之程之间能能传递任意大的信息,任意大的信息,但在但在实现时所开的所开的缓冲区太小是有限的,故当管冲区太小是有限的,故当管道写道写满时,发送送进程就被阻塞,只有当接收程就被阻塞,只有当接

44、收进程程从管道中从管道中读出一部或全部信息后,出一部或全部信息后,发送送进程才能程才能继续向管道写信息。向管道写信息。反之也一反之也一样,当接收,当接收进程程读空管道空管道时,就要等待,就要等待发送送进程程继续将信息写入管道。将信息写入管道。在在UNIX中,管道是以文件中,管道是以文件为基基础,再适当考,再适当考虑其其特殊要求而特殊要求而实现的通信机构。的通信机构。514.6 软中断和信号机构软中断和信号机构4.6.1 信号的产生与类型信号的产生与类型 1. 信号的概念信号的概念v UNIX提提供供了了一一组组软软中中断断信信号号,用用于于模模拟拟硬硬件件中中断断,但但它它们们的的实实现现机机

45、制制是是不不同同的的。信信号号是是一一取取值值为为119(MAX_SIGS)的的某某个个整整数数,可可以以在在进进程程之之间间传传送送,用用于于通通知知进进程程发发生生了了某某种种异异常常事事件件,需需要执行事先安排好的动作。要执行事先安排好的动作。v进进程程在在运运行行中中的的某某几几个个时时机机要要主主动动通通过过信信号号机机制制检检查查是是否否有有信信号号到到达达,如如有有,便便中中断断正正在在执执行行的的程程序序,转入对应的事件处理程序。转入对应的事件处理程序。v处处理理完完毕毕,再再返返回回断断点点执执行行原原先先的的程程序序。信信号号处处理理过程与硬件中断处理很相似,故称为过程与硬

46、件中断处理很相似,故称为“软中断软中断”。52 2. 信号的产生信号的产生在在UNIX中,中,主要主要在以下几种情况下向在以下几种情况下向进程程发送送软中中断信号:断信号:1 1)在用)在用户态运行运行时产生了各种生了各种软、硬件故障。、硬件故障。2 2)用)用户通通过键盘按按键向与向与该终端有关的端有关的进程程发信号信号3 3)进程之程之间通通过系系统调用用kill传送信号。送信号。信号机构将信号机构将发给进程的信号存放在程的信号存放在该进程程proc结构的构的p_sig项。进程收到信号后并不立即程收到信号后并不立即进行行处理,只有理,只有当当进程从核心程从核心态即将返回到用即将返回到用户态

47、时,即系,即系统调用、用、陷入或中断返回陷入或中断返回时才才检查p_sig项,并,并处理与信号理与信号对应的事件。的事件。如一个如一个进程程处于于较低低优先先级的睡眠状的睡眠状态,那么系,那么系统将将唤醒醒该进程,使其程,使其转入就入就绪状状态,并在被,并在被调度程序度程序选中,中,转入入执行状行状态时执行信号行信号处理程序。理程序。53 3. 信号的类型信号的类型00没有收到信号没有收到信号1 SIGHUP 终止止进程程终端端线挂断挂断22SIGINT 终止止进程程在在键盘上上击“ DELETE”键7 7SIGFPE 产生生core 浮点溢出浮点溢出9 9SIGKILL 终止止进程程无条件无

48、条件终止止进程程1111SIGSEGV 产生生core 段段违例例1414SIGALARM 终止止进程程闹钟1515SIGTERM 终止止进程程软件件终止止1616SIGUSR1 终止止进程程用用户自定自定义1717SIGUSR2 终止止进程程用用户自定自定义1919SIGPWR 终止止进程程 电源故障源故障544.6.2 信号的处理方式及设置信号的处理方式及设置 1. 信号的处理方式信号的处理方式每一个进程的每一个进程的user结构中有一个长度为结构中有一个长度为NSIG(20)的数组的数组signalNSIG,以信号类型作为该数组的下以信号类型作为该数组的下标索引,元素的值决定了对应信号的

49、处理方式。信标索引,元素的值决定了对应信号的处理方式。信号的处理方式有三类号的处理方式有三类 (1)若数组元素值为)若数组元素值为0,则执行信号机构定义的,则执行信号机构定义的缺省动作。缺省动作。 (2)若数组元素值为)若数组元素值为1(或奇数),则忽略该信(或奇数),则忽略该信号,不执行任何动作。号,不执行任何动作。 (3)若数组元素值为)若数组元素值为偶数偶数(函数入口地址),则(函数入口地址),则作为对应信号处理程序的指针。作为对应信号处理程序的指针。55 2. 信号处理方式的设置信号处理方式的设置一个一个进程在程在创建建时,继承了父承了父进程所有的信号程所有的信号处理方式,也理方式,也

50、即其即其signalNSIG各元素的各元素的值与父与父进程完全相同。但此后除程完全相同。但此后除了了SIGKIL外,信号表中定外,信号表中定义的信号的信号处理方式都可以用系理方式都可以用系统调用用signal(sig,func)设置或修改。置或修改。设置的方法是:置的方法是:int sig; int func(),(),(*oldptr)();)(); : oldptr = signal(sig,func);); :其中其中sig为信号信号类型,取型,取值范范围为119119,但不包括,但不包括9 9(SIGKIL),),func为新的信号新的信号处理函数,理函数,oldptr为函数指函数指针

51、,用于保存系,用于保存系统调用用signal返回的信号返回的信号sig原先原先处理函数入理函数入口地址,以便有必要口地址,以便有必要时可恢复原先的信号可恢复原先的信号处理方式。理方式。56:p_sig :a:&newfunc:(oldptr)( ):newfunc( ):0 aoldptrprocu.u-signal进程进程Pa的图像的图像图图4-9信信号号处处理理方方式式的设置的设置574.6.3 信号的传送信号的传送利用信号利用信号实施施进程程间通信的主要方式是使用系通信的主要方式是使用系统调用用kill(pid,sig),其功能是将信号其功能是将信号sig传送送给由由参数参数pid限定的

52、限定的进程。当:程。当:pid为正正值时,对应于一个有效的于一个有效的进程程标识数,数,该信号就信号就发送送给这个唯一的个唯一的进程。程。pid为0 0时,将信号,将信号发送送给受同一受同一终端控制的所有端控制的所有进程。程。pid为-1-1时,将信号,将信号发送送给与与发送送进程用程用户标识数相同的所有数相同的所有进程。程。pid -1时,将信号,将信号发送送给组标识数数为pid的的绝对值的所有的所有进程。程。下面下面举一个信号机构方法的例子。一个信号机构方法的例子。58# include # include main ( )int status;pid_t pid;void func (

53、);signal (SIGUSR1,func);1 /* 预置信号处理程序预置信号处理程序 */if (pid=fork () ) 2 printf (Parent: will send signal.n);4 kill (pid, SIGUSR1); 5/* 发送发送信号信号 */ wait (& status); 6 /* 等待子进程停止等待子进程停止 */ printf (status=%d: Parent finish:n,status);10 else sleep (10); 3 /* 等待接受信号等待接受信号 */ printf (Child:signal is received.

54、n);8 exit (0); 9 59void func () printf (It is signal processing function.n); 7 在程序的开始部分用系统调用设置信号在程序的开始部分用系统调用设置信号16的处的处理方式为执行理方式为执行func程序,在父进程用程序,在父进程用fork创建子进创建子进程后,子进程继承了对信号的处理方式。父进程程后,子进程继承了对信号的处理方式。父进程向子进程发送信号后,如子进程处于低优先权睡向子进程发送信号后,如子进程处于低优先权睡眠,则将其唤醒。子进程被唤醒后,检查是否收眠,则将其唤醒。子进程被唤醒后,检查是否收到信号,发现已收到信号

55、,就执行该信号到信号,发现已收到信号,就执行该信号(SIGUSR1)所对应的处理程序所对应的处理程序func()。()。执行执行完毕后返回,继续执行余下程序段。完毕后返回,继续执行余下程序段。60Solaris的进程通信机制的进程通信机制SPARC处理机理机为互斥原互斥原语实现了有原子性了有原子性test-and-set语义的内存的内存访问指令。如指令。如cas(compare and swap,比,比较和交和交换)指令,如果第一个寄)指令,如果第一个寄存器与内存存器与内存单元的内容相同,元的内容相同,则交交换内存内存单元和元和第二个寄存器的内容。第二个寄存器的内容。锁以几种不同的形式出以几种

56、不同的形式出现。Solaris内核中最常用内核中最常用的是互斥的是互斥锁,它可以,它可以实现对数据的互斥数据的互斥读写写访问。此外此外还有有读/写写锁,它适用于在同一,它适用于在同一时刻刻对同一同一数据可以有多个数据可以有多个读操作,但只能有一个写操作的操作,但只能有一个写操作的情况。情况。在内核的一些部分,如果在内核的一些部分,如果获取最佳性能是要追求取最佳性能是要追求的首要目的首要目标,为了提高速度,了提高速度,许多多锁代代码用用汇编语言言实现,而不是,而不是C语言。言。61Solaris支持支持System V的三种的三种IPC机制(共享内机制(共享内存、信号量和消息存、信号量和消息队列

57、),列),还支持基于套接字支持基于套接字的的进程程间通信机制。同通信机制。同时,Solaris引入了自己引入了自己独特的独特的IPC机制机制Solaris门。Solaris门是一种快速的是一种快速的进程程间过程程调用,用,这种种类似于似于远程程过程程调用的机制允用的机制允许我我们快速地快速地调用其他用其他进程中的方法。程中的方法。一个一个进程可以通程可以通过创建建门而成而成为门服服务器,器,门是一个函数,在服是一个函数,在服务器中以器中以线程的形式存在,程的形式存在,其他的客其他的客户端端进程可以程可以调用用门。Solaris门门62Solaris门服服务器会在器会在线程池中程池中创建一个内核

58、建一个内核线程以等待客程以等待客户端的端的调用,只要用,只要门线程池中程池中还有空有空闲的的线程,客程,客户端就端就能能马上得到服上得到服务,这就使得就使得门函数的函数的调用非常快速。用非常快速。服服务器器进程成功程成功创建建门时,返回一个,返回一个门的描述符。的描述符。门服服务器器进程通程通过创建一个建一个门(door_create()来使得来使得该进程中的程中的一个函数可以被客一个函数可以被客户端的端的进程所使用。程所使用。内核中将内核中将门实现为一个一个伪文件系文件系统doorfs。进程通程通过门描描述符来引用述符来引用门,门描述符在形式和功能上都与文件描述符描述符在形式和功能上都与文件

59、描述符相似。服相似。服务器必器必须将将创建的建的门和一个文件系和一个文件系统名字空名字空间的的文伴描述符相关文伴描述符相关联,服,服务器端是通器端是通过调用用fattach()来将一来将一个文件系个文件系统路径名和路径名和门文件描述符相关文件描述符相关联的。的。一旦关一旦关联充成,客充成,客户端就可以端就可以对该路径名路径名进行打开操作,行打开操作,并且在并且在door_call()使用打开操作返回的文件捕述符来得到使用打开操作返回的文件捕述符来得到一个一个门的描述符,客的描述符,客户端通端通过门描述符来找到一个描述符来找到一个门。Solaris门门63Solaris中的信号处理中的信号处理S

60、olaris中的信号中的信号处理是理是进程程级别的,但每个的,但每个线程可以有自己程可以有自己的信号屏蔽掩的信号屏蔽掩码。线程可以独立于同一程可以独立于同一进程中程中执行的其他行的其他线程来程来选择自己要屏自己要屏蔽的信号,因而在蔽的信号,因而在进程程执行的不同行的不同时刻可以有不同的刻可以有不同的线程来程来接收不同的信号。接收不同的信号。接口接口pthread_sigmask()用来建立每个用来建立每个线程的信号屏蔽掩程的信号屏蔽掩码。进程中的所有程中的所有线程共享所有信号的程共享所有信号的处理及理及处理例程,那么具理例程,那么具有默有默认处理的理的SIGINT信号(作信号(作为例子)的例子

61、)的产生将会使整个生将会使整个进程退出。作程退出。作为异常的异常的结果果产生的同步信号(生的同步信号(SIGFPE、SIGILL等)将被等)将被发送到送到产生异常的生异常的线程本身。程本身。异步信号是所有没有被定异步信号是所有没有被定义为异常的其他信号,它异常的其他信号,它们将被将被传递到系到系统找到的第一个不屏蔽找到的第一个不屏蔽该信号的信号的线程。程。信号在数据信号在数据结构中表示构中表示为二二进制位,例如制位,例如设置第置第16位,位,SIGURS1(这实际上是位上是位15,位的,位的编号是从号是从0开始的)开始的)。644.7 死锁死锁4.7.1 4.7.1 产生死锁的原因产生死锁的原

62、因图图 4-10 过过河河的的相持相持65当两个进程各占了对方所要的一个资源,当两个进程各占了对方所要的一个资源,就会形成死锁就会形成死锁进程进程B等待资源等待资源R1资源资源R1 进程进程B 进程进程A资源资源R2进程进程A占用资源占用资源R1进程进程A等待资源等待资源R2进程进程B占用资源占用资源R2图图4-11两两个个进进程程的的死锁死锁66系系统资源可分源可分为两两类,一,一类是可重复使用的是可重复使用的永久性永久性资源源,另一,另一类是会被消耗的是会被消耗的临时性性资源源。可重复用。可重复用的的资源在使用后不会减少源在使用后不会减少资源。源。进程在程在释放了可重放了可重用用资源后,源

63、后,该资源又可被其他源又可被其他进程再次使用。可重程再次使用。可重用的用的资源有源有处理机、主存、理机、主存、暂存、存、I/O通道、打印机通道、打印机以及文件、数据以及文件、数据库等。等。可重用的可重用的资源又可分源又可分为可剥可剥夺的的资源源和和不可剥不可剥夺的的资源源。最典型的可剥。最典型的可剥夺的的资源是源是处理机。最普通的理机。最普通的不可剥不可剥夺的的资源是打印机,当系源是打印机,当系统把把这类资源分配源分配给进程后,只能在使用完程后,只能在使用完毕后由后由进程自愿程自愿释放,系放,系统不能不能强行收回。行收回。涉及到可重用涉及到可重用资源的死源的死锁例子是:一个例子是:一个进程占用

64、了程占用了打印机,又要申打印机,又要申请磁磁带机,另一个机,另一个进程占用了磁程占用了磁带机,又要申机,又要申请打印机,打印机,这样每个每个进程都占用并保持程都占用并保持了一个了一个资源,并等待源,并等待对方所占用的方所占用的资源源时就就发生了生了死死锁。674.7.2 产生死锁的条件产生死锁的条件同同时具具备下列三个静下列三个静态的必要条件的必要条件时,才有可能,才有可能产生死生死锁。 (1)(1)互斥互斥执行行每次只能允每次只能允许一个一个进程占有和使用一程占有和使用一个个资源,其他申源,其他申请该资源的源的进程被阻塞。程被阻塞。(2)(2)保持并等待保持并等待当当进程等待分配程等待分配给

65、它新的它新的资源源时,保持占有已分配的保持占有已分配的资源。源。(3)(3)不可剥不可剥夺不能不能强迫移去迫移去进程占有的未使用完的程占有的未使用完的资源。源。 上述上述这三个条件是三个条件是产生死生死锁的必要条件,但即使存在全的必要条件,但即使存在全部部这三个条件也不一定会三个条件也不一定会发生死生死锁。要。要产生死生死锁必必须存在存在第四个第四个动态条件:条件:(4)(4)循循环等待等待存在一个存在一个闭合的合的进程程资源源链,以,以致每一个致每一个进程至少占有程至少占有链中下一个中下一个进程所需要的一个程所需要的一个资源。源。684.7.3 死锁的预防死锁的预防 1 1互斥互斥执行行一般

66、一般说,第一个条件是不能排除的,如果存,第一个条件是不能排除的,如果存取一个取一个资源需要互斥源需要互斥执行,那么操作系行,那么操作系统就要就要支持互斥支持互斥执行。某些行。某些资源,例如文件,可以允源,例如文件,可以允许多个用多个用户同同时读,但,但对写只能互斥地写只能互斥地进行。行。就是在就是在这个情况,如果一个以上的个情况,如果一个以上的进程需要程需要进行写操作,就可能行写操作,就可能发生死生死锁。 2 2保持和等待保持和等待保持和等待条件是能保持和等待条件是能预防的,只要防的,只要进程一次程一次申申请它所需要的所有的它所需要的所有的资源,在所有的需要同源,在所有的需要同时满足以前,阻塞

67、自己。足以前,阻塞自己。69v有几种方法可有几种方法可预防防这个条件。一个方法是,如个条件。一个方法是,如占有某些占有某些资源的源的进程不能程不能获得得进一步的一步的资源,源,该进程必程必须释放原先所占有的放原先所占有的资源;如果需要,以后再源;如果需要,以后再申申请这些些资源。源。v另外的方法是,如果一个另外的方法是,如果一个进程需要申程需要申请当前正当前正被其他被其他进程占用的程占用的资源,操作系源,操作系统就要求后者就要求后者释放放它所占用的它所占用的这类资源。源。这种种预防死防死锁的方法只能用的方法只能用在后申在后申请资源的源的进程程优先先级较高的情况下。高的情况下。v只有当只有当资源

68、的状源的状态容易保存和便于以后恢复的容易保存和便于以后恢复的情况下,情况下,这种方法才是种方法才是实际可行的。可行的。处理机就是理机就是这类资源的例子,如剥源的例子,如剥夺像打印机那像打印机那样的的资源,就会源,就会使使输出出变得得杂乱无章、毫无意乱无章、毫无意义。但借助。但借助spooling技技术可将独享可将独享设备改改为虚虚拟的共享的共享设备,就能破坏,就能破坏本条件,本条件,预防死防死锁。 3不可剥夺不可剥夺70 4 4循循环等待等待采用有序采用有序资源使用法可以防止循源使用法可以防止循环等待条件。等待条件。如果一个如果一个进程已程已经分配了分配了类型型R的的资源,那么以源,那么以后它

69、只能申后它只能申请在在资源源顺序表中排在序表中排在R后面的后面的资源源类型。型。1 2 3 4 5数数模模转转换换器器磁磁带带机机打打印印机机光光刻刻机机绘绘图图仪仪71五个哲学家吃通心面五个哲学家吃通心面P1: 思考思考semWait(f1) 取取 f1 semWait (f2) 取取 f2吃通心面吃通心面 放下放下f1,f2 semSignal(f1) semSignal(f2)p1f1f2p2f3f4f5p3p4p5P5: 思考思考 semWait (f5) 取取 f5 semWait (f1) 取取 f1 吃通心面吃通心面 放下放下f5,f1 semSignal (f5) semSig

70、nal (f1).72五个哲学家吃通心面五个哲学家吃通心面P1: 思考思考 semWait(f1) 取取 f1 semWait (f2) 取取 f2 吃通心面吃通心面 放下放下f1,f2 semSignal(f1) semSignal(f2)p1f1f2p2f3f4f5p3p4p5P5: 思考思考 semWait (f1) 取取 f5 semWait (f5) 取取 f1 吃通心面吃通心面 放下放下f5,f1 semSignal (f5) semSignal (f1).734.7.4 死锁的避免死锁的避免死死锁避免的方法允避免的方法允许三个死三个死锁的必要条件都存的必要条件都存在,但要在,但要

71、动态地地进行行审慎的判断,以保慎的判断,以保证运行不运行不会到达死会到达死锁这一点上。避免死一点上。避免死锁主要有以下两个主要有以下两个判断和判断和处理理时机:机:(1)(1)进程启程启动时判断判断如果如果对资源的要求会源的要求会导致死致死锁,就不启,就不启动有关有关进程。程。这种方法种方法仅仅在在当前所有当前所有进程程对资源的最大源的最大请求加上启求加上启动进程程对资源的源的请求都求都满足的情况下,才能启足的情况下,才能启动新新进程,程,故故这种避免死种避免死锁的策略不会是最的策略不会是最优的,因的,因为它假它假定的是最坏情况,即所有定的是最坏情况,即所有进程都同程都同时需要最大数需要最大数

72、量的量的资源。源。(2)(2)资源分配源分配时判断判断如果如果对资源的分配会源的分配会导致死致死锁,就,就暂不允不允许进一步一步为进程分配程分配资源。源。74分配分配资源源时,申,申请者要把同者要把同类资源的最大需求量源的最大需求量告告诉系系统,如系,如系统现存的可用存的可用资源数能源数能满足申足申请者剩余需求量者剩余需求量时,就,就满足当前的部分或全部申足当前的部分或全部申请,否否则就推就推迟分配。分配。这样至少保至少保证有一个申有一个申请者能得到所需的全部者能得到所需的全部资源,可源,可执行到行到结束,然后束,然后释放放资源供源供别的申的申请者者使用。使用。如果系如果系统保保证申申请者在有

73、限的者在有限的时间内能内能获得所需得所需的全部的全部资源,源,则称系称系统处于于安全状安全状态,否,否则称系称系统处于于不安全状不安全状态,并有可能引起死,并有可能引起死锁。银行家行家算法是在能确保系算法是在能确保系统处于安全状于安全状态时才把才把资源分源分配配给申申请者。者。银行家算法银行家算法75例例:有有8 8个个资源供三个源供三个进程共享,它程共享,它们的最大的最大需求数分需求数分别为6 6、4 4、7 7。在某一。在某一时刻,刻,资源的分配源的分配情况如下所示:情况如下所示:最大需求最大需求 当前占有当前占有还要要申申请P0624P1422P2716系系统剩余数剩余数3 3这时,系,

74、系统处于安全状于安全状态,因,因为剩余的剩余的资源可源可以先供以先供进程程P1使用,使用,P1运行运行结束后将束后将释放所占全放所占全部部资源,源,这样系系统剩余剩余资源数源数变为5 5,又可保,又可保证P0的全部申的全部申请得到得到满足。等到足。等到P0归还所占所占资源后,就源后,就可可满足足P2的申的申请。如此系。如此系统存在着一个安全的存在着一个安全的资源源分配序列。分配序列。76但在上述的状但在上述的状态中,如果中,如果P0要申要申请2 2个(而不是个(而不是1 1个)个)资源,系源,系统就不能立即分配就不能立即分配给它,而要推它,而要推迟到一个适当的到一个适当的时机再机再实施分配施分

75、配过程,否程,否则系系统资源的分配情况将源的分配情况将变为:最大需求最大需求当前占有当前占有还要申要申请P0642P1422P2716系系统剩余数剩余数 1 1这种状种状态是不安全的,因是不安全的,因为剩余的剩余的资源数已源数已不能不能满足任何一个足任何一个进程程还要申要申请的的资源数,如此源数,如此就可能形成死就可能形成死锁。774.7.5 死锁的检测死锁的检测死死锁的的预防策略是非常保守的,它是靠限制防策略是非常保守的,它是靠限制对资源的存取及源的存取及进程的并程的并发执行程度来行程度来实施的。施的。与其相反,死与其相反,死锁检测策略不减少策略不减少对资源的存取或限制源的存取或限制进程的并

76、程的并发运行。使运行。使用死用死锁检测,只要可能,就将所申,只要可能,就将所申请的的资源分配源分配给进程。操作系程。操作系统定期地定期地执行行检查算法,以判断是否存在条件算法,以判断是否存在条件4 4的循的循环等待等待链。78占用资源号占用资源号进程号进程号 1 1 2 2 3 4 4 3进程号进程号等待资源号等待资源号 1 2 2 4 3 1 4 2资源分配表资源分配表资源等待表资源等待表s2s3s1s4p1p3p2p4等待资源等待资源占用占用资源资源状态图和状态表状态图和状态表794.7.6 死锁的解除死锁的解除下面列下面列举了一些解除死了一些解除死锁的方法。的方法。强迫撤迫撤销所有的死所

77、有的死锁进程。程。将每一个死将每一个死锁进程退回到一些以前定程退回到一些以前定义的的“检查站站”,再启,再启动进程。程。这需要系需要系统支持支持进程的回退程的回退和重启和重启动机制。机制。逐个撤逐个撤销死死锁进程,直至死程,直至死锁不存在。不存在。终止死止死锁进程的次序程的次序应当基于最小代价的当基于最小代价的标准。每准。每终止一止一个个进程后就程后就调用死用死锁检测算法,以判定死算法,以判定死锁是否是否还存在。存在。相相继地剥地剥夺进程所占的程所占的资源,直至死源,直至死锁不再存在。不再存在。同同样,剥,剥夺资源的次序源的次序应基于成本方面的考基于成本方面的考虑。被剥被剥夺资源的源的进程必需

78、回退到程必需回退到获得得该资源之前的源之前的某个某个执行点上。行点上。804.9 Solaris的进程通信机制的进程通信机制SPARC处理机理机为互斥原互斥原语实现了有原子性了有原子性test-and-set语义的内存的内存访问指令。如指令。如cas(compare and swap,比,比较和交和交换)指令,如果第一个寄)指令,如果第一个寄存器与内存存器与内存单元的内容相同,元的内容相同,则交交换内存内存单元和元和第二个寄存器的内容。第二个寄存器的内容。锁以几种不同的形式出以几种不同的形式出现。Solaris内核中最常用内核中最常用的是互斥的是互斥锁,它可以,它可以实现对数据的互斥数据的互斥

79、读写写访问。此外此外还有有读/写写锁,它适用于在同一,它适用于在同一时刻刻对同一同一数据可以有多个数据可以有多个读操作,但只能有一个写操作的操作,但只能有一个写操作的情况。情况。在内核的一些部分,如果在内核的一些部分,如果获取最佳性能是要追求取最佳性能是要追求的首要目的首要目标,为了提高速度,了提高速度,许多多锁代代码用用汇编语言言实现,而不是,而不是C语言。言。814.9.2 Solaris中的信号处理中的信号处理Solaris中的信号中的信号处理是理是进程程级别的,但每个的,但每个线程可以有自己程可以有自己的信号屏蔽掩的信号屏蔽掩码。线程可以独立于同一程可以独立于同一进程中程中执行的其他行

80、的其他线程来程来选择自己要屏自己要屏蔽的信号,因而在蔽的信号,因而在进程程执行的不同行的不同时刻可以有不同的刻可以有不同的线程来程来接收不同的信号。接收不同的信号。接口接口pthread_sigmask()用来建立每个用来建立每个线程的信号屏蔽掩程的信号屏蔽掩码。进程中的所有程中的所有线程共享所有信号的程共享所有信号的处理及理及处理例程,那么具理例程,那么具有默有默认处理的理的SIGINT信号(作信号(作为例子)的例子)的产生将会使整个生将会使整个进程退出。作程退出。作为异常的异常的结果果产生的同步信号(生的同步信号(SIGFPE、SIGILL等)将被等)将被发送到送到产生异常的生异常的线程本

81、身。程本身。异步信号是所有没有被定异步信号是所有没有被定义为异常的其他信号,它异常的其他信号,它们将被将被传递到系到系统找到的第一个不屏蔽找到的第一个不屏蔽该信号的信号的线程。程。信号在数据信号在数据结构中表示构中表示为二二进制位,例如制位,例如设置第置第16位,位,SIGURS1(这实际上是位上是位15,位的,位的编号是从号是从0开始的)开始的)。82Solaris支持支持System V的三种的三种IPC机制(共享内机制(共享内存、信号量和消息存、信号量和消息队列),列),还支持基于套接字支持基于套接字的的进程程间通信机制。同通信机制。同时,Solaris引入了自己引入了自己独特的独特的I

82、PC机制机制Solaris门。Solaris门是一种快速的是一种快速的进程程间过程程调用,用,这种种类似于似于远程程过程程调用的机制允用的机制允许我我们快速地快速地调用其他用其他进程中的方法。程中的方法。一个一个进程可以通程可以通过创建建门而成而成为门服服务器,器,门是一个函数,在服是一个函数,在服务器中以器中以线程的形式存在,程的形式存在,其他的客其他的客户端端进程可以程可以调用用门。4.9.4 Solaris门门83Solaris门服服务器会在器会在线程池中程池中创建一个内核建一个内核线程以等待客程以等待客户端的端的调用,只要用,只要门线程池中程池中还有空有空闲的的线程,客程,客户端就端就

83、能能马上得到服上得到服务,这就使得就使得门函数的函数的调用非常快速。用非常快速。服服务器器进程成功程成功创建建门时,返回一个,返回一个门的描述符。的描述符。门服服务器器进程通程通过创建一个建一个门(door_create()来使得来使得该进程中的程中的一个函数可以被客一个函数可以被客户端的端的进程所使用。程所使用。内核中将内核中将门实现为一个一个伪文件系文件系统doorfs。进程通程通过门描描述符来引用述符来引用门,门描述符在形式和功能上都与文件描述符描述符在形式和功能上都与文件描述符相似。服相似。服务器必器必须将将创建的建的门和一个文件系和一个文件系统名字空名字空间的的文伴描述符相关文伴描述

84、符相关联,服,服务器端是通器端是通过调用用fattach()来将一来将一个文件系个文件系统路径名和路径名和门文件描述符相关文件描述符相关联的。的。一旦关一旦关联充成,客充成,客户端就可以端就可以对该路径名路径名进行打开操作,行打开操作,并且在并且在door_call()使用打开操作返回的文件捕述符来得到使用打开操作返回的文件捕述符来得到一个一个门的描述符,客的描述符,客户端通端通过门描述符来找到一个描述符来找到一个门。Solaris门门84思考思考题:为什么什么Windows和和Unix等等实际操作系操作系统在在设计中不采取中不采取课程教学中程教学中讲过的各种死的各种死锁解决方法,而任系解决方法,而任系统发生死生死锁呢呢复复习题p104 1,2, 4, 6, 习题p105 10课堂堂讲解解题p105 985谢谢大家!谢谢大家!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号