1、第6章 进程间的制约关系,1.,2.,3.,本章讲述内容:,进程间的两种制约关系互斥与同步 ;,正确处理互斥与同步的方法信号量以及在信号量上的P、V操作 ;,死锁以及解决死锁的途径 ;,进程间的高级通信 。,4.,假定这样进行管理:为输出井 设置一张 “输出井文件目录表”,它 由若干目录项组成。每个目录项记 录一个要打印输出的文件名以及该 文件在磁盘的存放地址。为了管理 该目录表,系统安排了两个指针: out和in。“缓输出程序”根据out的指点进行打印,out总是 指向下一个被打印的文件;井管理写程序根据in的指点存 放要求输出的文件目录信息,in总是指向下一个可用的目录项位置。,6.1 进
2、程间的制约关系,6.1.1与时间有关的错误,与时间有关的错误,1.,进程的并发,使一个进程何时占有处理机、占有多长时间、执行速度的快慢、以及外界对进程产生作用等都带有随机性。因此,一个进程对其他进程的影响无法预测。在操作系统里,把这种由于时间因素的影响而产生的错误,称为“与时间有关的错误”。,对输入井文件目录的管理,2.,读in的当前内容 ; 根据指点,存入打印文件名 ; in的值加1 ;,test . c,group . p,robit . txt,4,5,6,7,4,out,7,in,输入井文件目录表,“井管理写” 程序,在复制过程中,若COPY已把R 里的记录拷贝到了T中,那么GET 和
3、PUT就可以并发执行了。即GET 从F里读出下一个记录送到R中的操 作,与PUT从T中取出里面的内容写入G的操作,谁先做谁后做都没有关系,不会影响到复制结果的正确性。由于利用了它们并发性,工作效率就会提高。但是,如果不去顾及这三者之间执行顺序的这种关系,随意让GET、COPY、PUT去并发执行,那么就会产生“与时间有关的错误”。,COPY:把输入缓冲区R里的记录拷贝到输出缓冲区T里;,GET:从文件F按照顺序读出一个记录,然后送入输入缓冲区R;,3.,通过双缓冲区复制文件,编写一个复制n个记录的程序,它把文件F中的每个记录依次读到输入缓冲区R,再从R拷贝到输出缓冲区T,最后写到文件G中。假定R
4、和T正好存放一个记录。写3个子程序作为进程来完成整个工作:,记录1,记录2,记录n,GET,COPY,PUT,文件F,记录1,记录2,记录n,文件G,输入缓冲区R,输出缓冲区T,PUT:从输出缓冲区T里读出一个记录,然后依照顺序写入文件G。,.,.,.,.,若不管GET、COPY、PUT的执行关系,那么可有六种执行可能:1)COPYPUTGET;2)COPYGETPUT;3)PUTCOPYGET4)PUTGETCOPY;5)GETCOPYPUT;6)GETPUTCOPY,.,记录3,记录4,记录n,文件F,记录2,记录1,文件G,R,T,记录1,GET,PUT,记录1,记录1,文件G,R,T,
5、记录3,记录4,记录n,文件F,记录1,记录4,记录n,文件F,记录3,记录1,文件G,R,T,记录1,COPY,记录1,记录4,记录n,文件F,记录3,记录3,文件G,R,T,记录1,1,2,3,.,对第六种情况的分析,(2),(3),(1),(4),一个进程在临界区内逗留有限时间后,就应该退出,以便给其他进程创造进入临界区的机会。,如果有若干个进程要求进入自己的临界区,那么它们不应互相排斥,致使谁也进不了临界区。,.,6.1.2 竞争资源互斥,1.,共享变量,在操作系统中,把那些可以被进程共享的资源(如文件、队列、缓冲区、表格、变量等)统称为“共享变量”或“临界资源”。,2.,互斥,与一个
6、共享变量(或临界资源)交往的多个进程,为了保证它们各自运行结果的正确性,当其中的一个进程正在对该变量(或临界资源)进行操作时,就不允许其他进程同时对它进行操作。进程间的这种制约关系被称为“互斥”。,3.,临界区,在进程程序中,只有涉及到共享变量的那一部分程序,才真正需要保证互斥地执行。通常,把进程程序中“真正需要保证互斥执行”的那一段程序,称为该进程的“临界区(或临界段)”。,4.,解决临界区互斥必须遵循的准则,.,.,每次只允许一个进程进入临界区。,一个进程需要等待另一个进程完成的操作或发送的信息,称为“同步条件”。,一个进程运行到某点时,除非合作进程已经完成了某种操作或发来了信息,否则就必
7、须暂时等待那些操作的完成或信息的到来。进程间的这种关系被称为“同步”。,6.1.3 协同工作同步,从文件F取出一个记 录送至输入缓冲区R,向COPY发送“可 以拷贝” 的消息,等待COPY发来的 “拷贝结束”的消息,等待GET发来“可 以拷贝” 的消息,将输入缓冲区R里的记录 拷贝到输出缓冲区T里,向GET发送“拷 贝结束”的消息,GET,COPY,1.,1.,2.,2.,3.,3.,1.,GET和COPY间的协调一致,GET读记录到R后,给COPY发送消息,告诉它R中已有记录,然后暂停下来,等待COPY发来 “拷贝结束”的消息。只有接到这个消息,GET才能去做下一步工作。COPY一直处于等待
8、。只有接到GET发送来 “可以拷贝”的消息才能工作,将R里的记录拷贝到T里,然后向GET发“拷贝结束”的消息,随之又等待GET发消息。,.,2.,同步、同步点、同步条件,.,暂停等待以取得同步的那一点,称为“同步点”,.,6.2.1 信号量与P、V操作的定义,1.,信号量的定义,所谓“信号量”,是一个具有非负初值的整型变量,并有一个队列与它关联。因此,定义一个信号量S时,要给出它的初值Vs,给出与它相关的队列指针Vq。在一个信号 量S上,只能做规定的两种操作:P操作,记为P(S);和V操作,记为V(S)。,2.,信号量S上的P操作定义,6.2 信号量与P、V操作,3.,信号量S上的V操作定义,
9、当一个进程调用P(S)时,应该顺序做下面两个不可分割的动作:Vs=Vs-1,即把当前信号量S的取值减1;若Vs=0,则调用进程继续运行;若Vs0,则调用进程由运行态变为阻塞态,到与该信号量有关的队列Vq上排队等待,直到其他进程在S上执行V操作将其释放为止。,当一个进程调用V(S)时,应该顺序做下面两个不可分割的动作:Vs=Vs+1,即把当前信号量S的取值加1;若Vs0,则调用进程继续运行;若Vs=0,则先从与该信号量有关的队列Vq上摘下一个等待进程,让它从阻塞态变为就绪态,到就绪队列排队,然后调用进程继续运行。,一个进程在做P操作后被阻塞,到关于信号量的队列上去排队等待,其含义是将进程的PCB
10、到此队列上排队。,从P(S)的定义可以看出,调用它的进程有两个出路:如果在对信号量当前值减1后,信号量的值大于等于0,则该进程继续运行下去;否则它就被阻塞,直到有别的进程通过做V(S)来唤醒它。但是从V(S)的定义可以看出,调用它的进程的状态是不会改变的,无论对信号量当前值加1后的结果如何,调用它的进程最终都将是继续运行下去。,4.,关于信号量及其P、V操作的几点说明,.,.,.,信号量初值一定是一个非负的整数。不过,由于P操作会在信号量的当前值上进行减1操作,V操作会在信号量的当前值上进行加1操作,因此运行过程中,信号量的取值就不再受“非负”所限了。,定义在信号量上的P操作和V操作,都由两个
11、不可分割的动作组成,即只要进入了P(S)或V(S),这两个动作就必须顺序地做完,中间不能被打断。所以,信号量上的P、V操作,实际都是原语 。,.,设置初值为1的信号量S, 在进程A和B的进入点处安排 关于信号量S的P操作,在进 程A和B的退出点处安排关于 信号量S的V操作。这样,就 能确保CSa和CSb互斥地执 行。在这种安排下,哪个进 程先对信号量S做P操作,就会使S的值由1变成为0,它就获得了 进入临界区的权利。当某个进程在临界区内时,S的值肯定是0。此时若一进程想做P操作进入自己的临界区,就会因S的值由0变为-1而受阻。只有在临界区内的那个进程退出临界区、对S做V操作时,S的值由-1变为
12、0,才会解除阻挡,从而保证互斥。,进入点:,进入点:,6.2.2 用P、V操作实现互斥,1.,临界区互斥执行的含义,假定把进程A程序的临界区记为CSa,进程B程序中的临界区记为CSb,所谓“CSa和CSb互斥地执行”,含义是:若进程A已进入了CSa,那么进程B就只能在CSb的进入点处等待,一直要等到进程A退出CSa,进程B才能进入CSb;同样,若进程B已进入了CSb,那么进程A就只能在其CSa的进入点处等待,一直要等到进程B退出CSb,进程A才能进入CSa。,2.,P、V操作图示,CSa,退出点:,进程A,进程A 的临界区,CSb,退出点:,进程B,进程B 的临界区,CSa,进程A,进程A 的
13、临界区,CSb,进程B,进程B 的临界区,P(S),P(S),V(S),V(S),Vs=1 (S初值),6.2.3 用P、V操作实现同步,1.,进程间取得同步的含义,若进程A在执行到X处时要得到进程B提供的信息,否则无法执行;进程B在做到Y的地方后,就为进程A准备好了所需的信息。这表明进程A要在X点处与进程B “ 取得同步”。即若进程B未到Y点前,进程A先于B到达了X点,那么A只能在X点处等待,直到进程B为它准备好了信息。但若在进程A到达X点前,B已经通过了Y点,已为进程A准备好了所需的信息,那么进程A就不会受到阻挡。,2.,同步图示,进程A,需要进程 B 的信息,X:,进程B,为进程A 准备
14、信息,Y:,进程A,同步点,X:P(S),进程B,同步条件,Y:V(S),为此,设初值为0的信号量S,在 进程A的X点处安排关于信号量S的P 操作,在进程B的Y点处安排关于信 号量S的V操作。这样,就能确保A 在X点处与B取得同步。假定在B未到达Y点前, A先于B到达了X点。由于Vs初值为0,做P(S) 后,Vs变为-1。因此A被阻塞,到S的队列Vq上去排队,等候B释放它。调度到进程B后,它准备好信息就在S上做V操作。因现在的Vs=-1,加1后Vs=0,故将A的PCB从队列上摘下,改为就绪态,让它重新参与调度。若在A到达X点前,B已通过了Y点,那么V操作后Vs的值就为1。这样,当进程A到达X点
15、对S做P操作时,是在值1上做减1操作,Vs变为0。进程A不会受到阻挡,从而顺利地通过X点。,Vs=0 (S的初值),6.2.4 用P、V操作实现资源分配,1.,信号量的物理意义,把信号量S的初值n视为某资源个数,那么进程在S上做一次P操作后,若Vs=0,则表示可给该进程分一个资源;若Vs0,表示原资源等待队列上没有进程等待,只是收回了一个资源。,2.,简单的“生产者-消费者”问题,生产者:,生产一个产品,P(M) (申请一个缓冲区),按in指点将物品存入缓冲区,in=(in+1) mod 10 (调整存入指针in),V(N) (向消费者发消息, 缓冲区里已有物品),消费者:,消费物品,P(N)
16、 (等待生产者发来消息),按out指点从缓冲区取出物品,out=(out+1) mod 10 (调整取出指针out),V(N) (向生产者发消 息,已有空缓冲区),Vm=10 Vn=0 (M,N初值),若有一个生产者和一个消费者,他们共享10个缓冲区。生产者不断地生产物品,并依次放入缓冲区中。消费者依次从缓冲区里取出物品进行消费。只有在缓冲区有空位时,生产者生产出来的物品才能往里存放;只有在缓冲区有物品时,消费者才能从里面取出物品消费。试用 P、V 操作来协调生产者和消费者间的工作。,设置4个信号量:m表示空闲缓冲区的数目;n表示已放物品缓冲区的数目;S1控制互斥 进入in临界区;S2控制互斥
17、进入out临界区。,6.2.5 互斥/同步样例分析,1.,“生产者-消费者”问题,若有 i 个生产者和j 个消费者,共享 k个缓冲区。生产者不断生产物品,并依次放入缓冲区中。消费者依次从缓冲区里取出物品进行消费。只有在缓冲区里有空位时,生产者生产出来的物品才能往里面放;只有在缓冲区里有物品时,消费者才能从里面取出物品进行消费。试用P、V操作协调生产者和消费者之间的工作。,生产者:,生产一个产品,P(M) (申请一个缓冲区),按in指点将物品存入缓冲区,in=(in+1) mod k (调整存入指针in),V(N) (向消费者发消息, 缓冲区里已有物品),消费者:,消费物品,P(N) (等待生产
18、者发来消息),按out指点从缓冲区取出物品,out=(out+1) mod k (调整取出指针out),V(N) (向生产者发消 息,已有空缓冲区),Vm=k,Vn=0 Vs1=1,Vs2=1 (信号量初值),P(S1) (要求进入in 临界区),V(S1) (退出in 临界区),P(S2) (要求进入out 临界区),V(S2) (退出out 临界区),.,.,设置两个信号量:MUTEX控制读者互斥进入reader临界区,WRT控制读者及写者互斥进入读/写临界区,初值都是1。,reader=reader-1 (读者计数器减1),2.,“读者-写者”问题,读者:,reader=1? (是第1个
19、读者?),P(MUTEX) (进入reader临界区),读者读取所需信息,reader=reader+1 (读者计数器加1),V(MUTEX) (退出reader临界区),P(WRT) (进入读/写临界区),P(MUTEX) (进入reader临界区),reader=0? (是最后一个读者?),V(MUTEX) (退出reader临界区),V(WRT) (退出读/写临界区),N,N,Y,Y,P(WRT) (进入读/写临界区),写者对数据进行修改,V(WRT) (退出读/写临界区),写者:,若一批数据被多个并发进程共享,其中一些进程只要求读数据,称为“读者”;另一些会对数据进行修改,称为 “写者
20、”。多个读者同时工作时,访问不会有问题。但是如果读者和写者或写者和写者同时工作时,就有可能导致错误访问结果。假定在有读者访问时,到来写者要求访问,那么写 者只能等待,但到来的后续读者仍可以进行访问, 这表示读者比写者有更高的访问权。试用P、V操 作来协调读者和写者之间的工作。,.,.,设一个初值为0的变量reader,它不是信号量,而是用来随时记录当前有多少个读者在同时使用数据。正因为允许多个读者同时使用数据,reader成为各读者共享的变量,所以要设置信号量MUTEX来控制读者互斥地使用它。,.,5个哲学家须互斥使用5只筷子,若其中一个拿到他右边的那只筷子,那么坐在他右边的哲学家的左手就暂时
21、不能拿那只筷子。为此,可以将筷子编号为04(如图所示),对应设置5个初值为1的互斥信号量:chopsticki (0i4) 第i个哲学家的“思考-就餐-思考”过程可描述为:,3.,“哲学家进餐”问题,.,5个哲学家围坐在圆桌旁,中央放一钵米饭。每人面前有一只盘子,盘子两边各放一只筷子,如图所示。,哲学家的生活是:思 考,就餐,再思考,循环往复。要求哲学家只有在拿 到他左右的两只筷子后,才能就餐;哲学家只能一只 只拿筷子,不能同时抓他旁边的两只筷子,也不能从 其他人手中抢筷子;哲学家就餐后必须放下手中的筷 子思考,不能强占筷子不放。试用信号量上的P、V操作,模拟“思考-就餐-思考”过程,保证他们
22、正常生活。,0,4,3,2,1,4,3,2,1,0,哲学家编号,筷子编号,philosopher(i) while(TRUE)think();P(chopsticki);P(chopstick(i+1) mod 5);eat();V(chopsticki);V(chopstick(i+1) mod 5); ,.,方案1,(1),为防止出现死锁危险,可考虑只允许4位哲学家进入餐厅,第5位只有在已进入就餐的一位哲学家退席后,才能去就餐。这时最多只有4位哲学家就座,因此至少可保证有一位哲学家能拿到他左右的两只筷子,从而完成就餐。,.,该过程可保证哲学家只有拿到了左右两只筷子才能进餐,那是通过算法中的
23、操作P(chopsticki)和P(chopstick(i+1) mod 5)实现的。该过程可保证两个相邻哲学家不会同时进餐,因如果第i位哲学家已在信号量chopsticki上做了P操作,那么坐在他旁边的那位哲学家再对该信号量做P操作时,就只能在该信号量上等待了。该过程可保证一位哲学家就餐完毕后,立即顺序地归还他所使用的左右两只筷子,那是通过算法中的操作V(chopsticki)和V(chopstick(i+1) mod 5)实现的。,.,但该算法忽略一个问题,它无法防止5位哲学家同时拿起各自左(右)边的筷子、又试图去拿右(左)边的筷子。这样,每个哲学家都拿到了一只筷子,而无休止地等待旁边的哲
24、学家放下另一只筷子,结果他们都不能进餐,一个个先后被饿死。,.,方案2,(2),.,为此,5只筷子仍需互斥使用,所以仍将筷子编号为04,对应设置5个初值为1的互斥信息量:chopsticki (0i4),.,由于整个餐厅只提供4个座位,因此要设置一个初值为4的同步信息量seat来管理4个座位(即是拥有的资源数)。某个哲学家进入餐厅时,必须先通过做P(seat)申请到一个座位,然后才能够去拿筷子;退出餐厅时,必须先归还筷子,然后做V(seat)退席。,为方便哲学家判定其左右相邻者当前所处状态,方案中设置两个变量:LEFT=(i+4) mod 5,RIGHT=(i+1) mod 5 (0i4) 由
25、哲学家的编号,计算LEFT和RIGHT的值,就得到其左右相邻哲学家的编号。,设置有5个元素的信号量数组si (0i4), 初值岛都为0,每个元素对应一个哲学家。在拿不到筷子就餐时,用它来与占用筷子的哲学家取得同步,以期归还筷子时,能唤醒受阻塞的哲学家。,.,第i(0i4)个哲学家的“思考-就餐-思考”过程可以描述为:,philosopher(i) while(TRUE)think();P(seat);P(chopsticki);P(chopstick(i+1) mod 5);eat();V(chopsticki);V(chopstick(i+1) mod 5);V(seat); ,方案3,(3
26、),.,为哲学家定义三种状态,THINKING 思考状态:哲学家就餐后,就由就餐状态EATING转变成思考状态。EATING 就餐状态:处于该状态的哲学家已拿到自己左右的两只筷子,由饥饿状态转变成为就餐状态。HUNGRY 饥饿状态:当某哲学家在思考中想吃饭时,就由思考状态转变成为饥饿状态。,.,设置数组statei (0i4),每个元素对应一个哲学家,随时记录他们生活过程中的不同状态。,.,.,.,为保证各哲学家在测试他左右相邻者的状态和设置新状态时,能互斥地进行,算法里用到互斥信号量mutex,初值为1。,.,哲学家程序,philosopher(i) while(TRUE)think();t
27、ake_chopstick(i);eat();put_chopstick(i);,.,获取筷子子程序,take_chopstick(i) P(mutex);statei=HUNGRY;test(i);V(mutex);*P(si); ,.,归还筷子子程序,put_chopstick(i) P(mutex);statei=THINKING;test(LEFT);test(RIGHT);V(mutex); ,.,测试状态子程序,test(i) if(statei=HUNGRY ,.,对于test(i),通过if的测试会有两种结果。一是i有要就餐的愿望,左右邻居都不处于EATING状态。这样,i的状
28、态就为EATING,然后在si上做V操作。由于这个V操作先于take_chopstick(i)里的P操作,因此它使信号量si的值由0变为1。这样,在take_chopstick(i)里退出mutex临界区后,P(si)使si的值由1变为0,不会阻止哲学家i的前进,从而去调用eat()。,.,若if语句条件不成立,这 可能是哲学家i没有想就餐,或哲学家i的左右邻居之一正在就餐。这时test(i)不会对信号量si做V操作。这样,在通过V(mutex)退出临界区后,就做take_chopstick(i)中的,P(si)。这时因为事先没有对信号量si做V操作,这个P操作使si的取值由0变为-1,导致哲
29、学家i在这个信号量上阻塞,等待他旁边的哲学家就餐完毕后唤醒他。,若没有顾客,理发师就坐在理发椅上打盹;当顾客来时,就唤醒打盹的理发师进行理发;若理发师全在工作,又来新顾客,则就坐在空座椅上等待理发,没有空座椅就离去。试用信号量上的P、V操作描述理发师和顾客的行为,保证该过程的正确实现。,4.,“理发店”问题,.,理发店中有k张理发椅和n张等待理发的顾客坐的座椅,如图所示。,座椅,座椅,座椅,座椅,座椅,理发椅,n张,入口,理发椅,k张,出口,.,设立三个信号量 custs:记录等待理发的顾客数(不包括正在理发的顾客),初值为0; barbs:正在等待为顾客理发的理发师数,初值为k; mutex
30、:保证互斥使用变量waiting的互斥信号量,初值为1。,.,为随时记录等待理发的顾客数,设置变量waiting,它的初值为0。注意,它是一个变量,不是信号量,不过它的值总是和信号量customers相同。,.,n :来到理发店等待理发的顾客数的上限值。,.,理发师程序,barber() while(TRUE)*P(custs);P(mutex);waiting=waiting-1;V(mutex);cut_hair();*V(barbs); ,.,顾客程序,customer() P(mutex);if(waitingn)waiting=waiting+1;*V(custs);V(mutex)
31、;*P(barbs);get_haicut();elseV(mutex); ,注意,barber()中注有“*”号的P(custs),与customer()中注有“*”号的V(custs)是相互呼应的一对同步信号量操作。若没有顾客时,理发师想工作,那么他将在信号量custs上等待顾客的唤醒。,.,.,barber()中注有“*”号的V(barbs),与customer()中注有“*”号的P(barbs)是相互呼应的又一对同步信号量操作。当顾客不断地进来、店里有空闲的座椅让其坐等理发时,如果 k个理发师都在忙于工作,那么这些顾客只能在信号量barbs上等待。,.,互斥条件:每个资源每次只能分配给
32、一个进程使用。,循环等待条件:系统中存在两个以上的进程,它们组成一个环路,该环路中的每个进程都在等待其相邻进程占用的资源。,部分分配(占用并等待)条件:进程由于申请不到所需要的资源而等待时,仍然占据着已经分配到的资源。,6.3 死锁、高级进程通信,6.3.1 死锁与产生死锁的必要条件,资源分配图,1.,用方框代表资源,圆圈代表进程。画一条由资源到进程的有向边,表示把该资源分配给这个进程;画一条由进程到资源的有向边,表示该进程要申请这个资源。这样的图就是所谓的 “ 资源分配图 ”。,A,R,B,S,D,C,T,U,死锁的定义,2.,所谓“死锁”,即指系统中若存在一组进程,它们中的每一个都占用了某
33、种资源而又都在等待其中另一个所占用的资源,这种等待永远不会结束。这就是死锁,或说这一组进程处于死锁状态。,产生死锁的四个必要条件,3.,.,.,.,非剥夺条件:已经分配给进程的资源,别的进程不能强行夺取。,6.3.2 死锁的预防,1.,死锁预防的含义,所谓“死锁的预防”,是指破坏产生死锁四个必要条件中的一条或几条,以使系统不会产生死锁。在死锁预防里,主要是破坏其他几个必要条件,而不去破坏“互斥条件”。,2.,破坏“部分分配(占用并等待)条件”,采用的办法是系统对进程实行一次性分配方案,即一个进程总是合盘提出总的资源需求,系统要么分配给它所需要的全部资源,要么一个也不给它。,3.,破坏“非剥夺条
34、件”,采用的办法是允许别的进程从占用进程手中强抢所占用的资源。,4.,破坏“循环等待条件”,采用的办法是将系统中的所有资源进行统一编号,进程按编号的顺序,由小到大提出对资源使用的申请。假定把不同编号的资源i和j分配给了进程A和B。那么如果ij,A就不允许再申请资源j;如果ij,B 就不允许再申请资源 i 。这样就形成不了资源申请的循环等待环路 。,A,i,A,B,i,j,B,j,1.输入机 2.打印机 3.绘图仪 4.磁带机 5.CD-ROM,.,6.3.3 死锁的避免,1.,死锁避免的含义,指允许系统存在产生死锁的条件,但在接到一个进程的资源请求时,总是根据当时资源的使用情况,按照一定的算法
35、去模拟分配,探测分配的结果。只有在探测结果表明绝对不会出现死锁时,才真正接受进程的这次资源请求。,2.,安全状态和不安全状态,.,若能在有限时间内,保证所有进程得到自己需要的全部资源,那么称系统此时处于“安全状态”;否则称系统处于“不安全状态”。很明显,在系统处于安全状态时,绝对不会发生死锁;在系统处于不安全状态时,系统有可能发生死锁。,3.,银行家算法对进程的要求,.,必须预先说明自己对资源的最大需求量;,只能一次一个地申请所需要的资源;,.,若已获得了资源的最大需求量,那么应在有限时间内使用完毕,并归还系统。,4.,实施银行家算法时系统的承诺,.,若进程对资源的最大需求量没超过该资源的总量
36、,应保证接纳这个进程,不得拒绝它;,在接到一个进程对资源的请求时,有权根据当前资源的使用情况暂时加以拒绝(即阻塞该进程)。但应保证在有限的时间内让它得到所需要的资源。,如果所有进程的“能执行完”均为1,表示接受这次请求是安全的;否则暂时不能接受进程的这次资源请求。,如果找到了,就假设它获得了最大资源数,并运行结束。于是把它的“能执行完”标志置为1。这样就能假定收回它使用的所有资源,使系统剩余资源数增加。,在这一假设下,检查每个进程对资源的还需要数。看能否找到一个进程,其还需数目小于系统剩余资源数。如果找不到,那么系统就有可能死锁,因 为任何进程都无法运行结束。,在安全状态下,系统接到进程的资源
37、请求后,先假定接受这一请求,把需要的资源分配给这个进程。,5.,单种资源银行家算法的基本思想,单种资源银行家算法:,将所有进程的 “能执行完”标志清0,假定接受该请求, 把资源分配给进程,将系统当前所有剩余资源 与”能执行完”标志为0的进 程还需资源数比较,找出一 个能满足其所有需求的进程,找到了吗?,将该进程的”能执行完” 标志置为1,系统收回它 所要求的全部资源数,Y,N,检查所有进程的 “能执行完”标志,还有” 能执行完 ” 标志为0的进程吗?,这一请求不安 全,暂时不予接受,Y,N,这一请求是安 全的,可以分配,.,.,.,.,.,在“能执行完”标志为0 的进程中重复以上两步,直 到找
38、不到资源还需数小于系统剩余资源数的进程时为止。,如果存在这种进程,那么假定它已获得需要的所有资源,并完成工作,把它的“能执行完”标志设置成1。收回它占用的资源,更新向量A。,检查还需资源表中是否有一个进程的行向量小于或等于向量A。如果没有,那么系统就可能会死锁,因为现在任何进程都无法完成了。,6.,多种资源银行家算法的执行步骤,系统设两张表:“分配资源表”,记录已分配给各进程的资源数;“还需资源表” ,记录各进程还需要的资源数。设3个向量:E记录各种资源的总数,P记录各种资源已分配数,A记录各种资源的剩余数。,进程,磁带机,绘图仪,打印机,CD-ROM,A,3,0,1,1,B,0,1,0,0,
39、C,1,1,1,0,D,1,1,0,1,E,0,0,0,0,进程,磁带机,绘图仪,打印机,CD-ROM,A,1,1,0,0,B,0,1,1,2,C,3,1,0,0,D,0,0,1,0,E,2,1,1,0,已分配资源表,还需资源表,E 6 3 4 2 (资源总数) P 5 3 2 2 (已分配数) A 1 0 2 0 (剩余数),.,假定接受一个进程提出的资源请求,修改向量P和A。,.,.,.,.,重复以上两步,直至再也找不到行向量小于或等于向量A的进程。,检查所有进程的 “能执行完” 标志。若这个标志都是1,则表示都能顺利地完成。因此,接受资源分 配后导致的新状态 是安全的;如果仍 存在“能执
40、行完”标 志为0的进程,则 说明这一请求所导 致的状态是不安全 的,应暂时拒绝该请求。,.,.,.,系统中有AG共7个进程,6个同类资源rw,当前的资源所属关系如下:,6.3.4 死锁的检测并恢复,1.,利用资源分配图检测死锁,r,A,s,C,D,F,w,u,G,t,B,E,v,.,A得到资源r,需要资源s;,.,B不占有资源,需要资源t;,.,C不占有资源,需要资源s;,D得到资源u和s,需要资源t;,.,E得到资源t,需要资源v;,F得到资源w,需要资源s;,G得到资源v,需要资源u。,2.,利用表格检测死锁,环路,资源,占用的进程,进程,等待的资源,r,A,s,C,t,B,u,B,v,A
41、,A,t,进程,等待的资源,A,t,B,C,s,v,通过建立“资源分配表”和“进程等待表”,随时检测资源的分配是否构成环路。假定现有3个进程AC,有5个同类型资源rv。,资源分配表,进程等待表,进程等待表,3.,死锁的恢复,一是删除环中的若干进程,释放占用的资源,使其他进程能继续运行;二是临时把某个资源从占用者手中剥夺,给另一个进程使用;三是周期地记录各进执行情况。一旦检测到死锁,就按记录的文件进行回退,让损失减到最小。,6.3.5 高级进程通信,1.,进程间的低级与高级通信,.,.,进程间的低级通信,信号量上的P、V操作是进程间的一种通信方式,它告诉对方缓冲区里是否可存数据,是否可取数据,是
42、否可读文件,是否可写文件,等等。但通信双方不交换信息,只是事先的一种约定。因此,用P、V操作实现的通信,是进程间的“低级通信”。,进程间的高级通信,为使进程间能交换数据,系统提供通信命令给用户在程序中使用。用户只要准备好参数,调用这些命令就能在进程间传递数据,这就是进程间的“高级通信”。,2.,直接通信,.,进程间直接通信的基本思想,发送者在自己的消息发送区里形成消息,然后申请一个消息缓冲区,把数据从消息发送区移入消息缓冲区中。通过发送命令,把这个消息缓冲区直接发送到接收者的消息队列里。接收者从自己的消息队列上摘下消息缓冲区,把里面的数据读到自己的消息接收区里,然后释放缓冲区。,提供发送消息和
43、接收消息的系统调用命令,比如发送命令为Send,接收命令为Receive。,系统中开辟消息缓冲区,构成是:name发送消息的进程名或标识; size发送消息的长度;text发送消息的正文内容; nPtr下一个消息缓冲区的指针。,.,进程间直接通信示意图,Send (消息发送区地址),接收进程名:B 消息长度:size 消息正文:text,进程A的 消息发送区,Receive (消息接收区地址),发送进程名:A 消息长度:size 消息正文:text,进程B的 消息接收区,进程A的程序,进程B的程序,进程B的PCB,MUTEX (1) SM (0) hPtr,发送进程名:A 消息长度:size
44、消息正文:text nPtr:,发送进程名:A 消息长度:size 消息正文:text nPtr:-1,消息缓冲区,消息缓冲区,(1),(2),(3),在进程的PCB中,增设管理消息队列的有关内容,它们是:hPtr消息队列的队首指针(每个进程的消息队列由其他进程发 来的消息缓冲区组成,hPtr总是指向第1个消息缓冲区);MUTEX在发送和接收中,信号量MUTEX保证对消息队列互斥 操作,初值为1。SM是控制接 收进程与发送进程取 得同步的信号量,初 值为0。运行 过程中,SM 的值是该进程 消息队列上消 息的个数。,向系统申请一个消息缓冲区;,根据接收进程名B,找到它的PCB,把消息缓冲区链入
45、它的消息队列队尾。,填写消息缓冲区,将消息发送区里的内容送入缓冲区;,.,Send和Receive命令,(1),发送命令Send的工作步骤,(2),接收命令Receive的工作步骤,Send(发送):,V(MUTEX) (退出消息队列临界区),申请消息缓冲区,将消息缓冲区里的 内容送入消息缓冲区,找到接收进程的PCB,P(MUTEX) (进入消息队列临界区),将消息缓冲区排入接 收进程的消息队列末尾,V(SM) (向接收者发消息),Receive(接收):,P(MUTEX) (进入消息队列临界区),P(SM) (接收发送者消息),从消息队列上摘 下第1个消息缓冲区,V(MUTEX) (退出消息
46、队列临界区),将消息缓冲区里的 内容读至消息接收区,释放消息缓冲区,.,.,.,.,.,在进程B接收消息之前,先在自己的存储区里开辟一个消息接收区,然后再发接收消息的命令Receive。,从消息队列上摘下第1个消息缓冲区;,.,将消息缓冲区里的内容送入消息接收区;,释放所占用的消息缓冲区。,在进程A调用命令Send向进程B发 送消息之前,先要在自己的存储空间里开辟 一个消息发送区,里面记录接收者的名称、 发送消息的长度以及发送的内容,然后才发 送消息命令Send。,“信箱头”给出信箱大小(size:格子个数及格子尺寸)、存信件指针(inPtr:发送者按此指针往信箱体格子里存信件)、取信件指针(
47、outPtr:接收者按此指针从信箱体格子里取信件)、空闲格子信号量(SI:存信件时通过它申请格子,初值为格子个数n)以及信件格子信号量(SO:取信件时通过它记录信件数,初值为0)等管理信息 。,“信箱体”用来存放一个个消息, 每一个消息放在一个格子里。,.,3.,间接通信,进程间间接通信的基本思想,间接通信是指由信箱来传递消息:当一个进程希望与另一个进程通信时,先创建链接这两个进程的信箱。随后,发送者把消息投入与接收者相连的信箱,接收者从信箱里接收所需要的消息。,格 子1,格 子2,格 子,Size:信箱尺寸 inPtr:存信件指针 outPtr:取信件指针 SI:初值=n SO:初值=0,信箱头,信箱体,进程A,进程B,发送,接收,(1),信箱的组成,(2),提供的命令,采用间接通信时,系统除提供Send、Receive命令外,还要提供Create(创建信箱)和Release(撤消信箱)命令。,.,.,