您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第六章分布式系统中的死锁
第六章分布式系统中的死锁6.1死锁问题死锁发生的条件(1)互斥。正如我们第五章所讨论的,互斥是一种资源分配方式,保证同一个资源在同一时刻最多只能被一个进程占用,它用于防止多个进程同时共享访问不可同时共享访问的资源。(2)不可剥夺的资源分配。系统将一个资源的访问权分配给某一个进程后,系统不能强迫该进程放弃对该资源的控制权。(3)占有并等待。必然有一个进程占用了至少一个资源,同时在等待获取被其他进程占用的资源。(4)循环等待。在等待图中有一个循环路径。第六章分布式系统中的死锁6.1死锁问题死锁的图论模型可以用图模型来表示死锁,表示死锁的图模型有两种,一种是等待图,另一种是资源分配图。1)在等待图中,节点代表进程,当且仅当进程Pi等待一个被进程Pj所占用的资源时,边(Pi,Pj)存在于等待图中,图中的边是有向的。2)资源分配图中的节点有两种:一种是进程节点,另一种是资源节点。每个边是一个有序对(Pi,Rj)或(Rj,Pi),其中P代表进程,R代表一个资源类型。边(Pi,Rj)表示进程Pi请求类型为Rj的一个资源,并且正在等待这个资源,一个资源类型中可能有多个资源。边(Rj,Pi)表示类型为Rj的一个资源已经分配给进程Pi。由于等待图假定一个资源类型中只有一个资源,所以资源分配图是一个比等待图更加有力的工具。第六章分布式系统中的死锁6.1死锁问题死锁的图论模型资源分配图实例:P1P2P3P1P2P3(a)不处于死锁状态(b)处于死锁状态R1R2R1R2第六章分布式系统中的死锁6.1死锁问题死锁的图论模型资源分配图到等待图的转化:(1)在资源分配图中找到一个未被处理的资源R。如果所有的资源都已经处理,转向步骤3。(2)从这个资源R的每个输入进程节点到每个输出进程节点之间加一条有向边。一个资源的输入进程节点是等待这个资源的进程节点,一个资源的输出进程节点是占有这个资源的进程节点。转向步骤1。(3)删除所有的资源节点以及相应的边。第六章分布式系统中的死锁6.1死锁问题死锁的图论模型资源分配图到等待图的转化实例:P4P3P2P1P5R5R4R3R2R1P4P3P2P1P5(a)资源分配图(b)等待图第六章分布式系统中的死锁6.1死锁问题处理死锁的策略死锁可以使用PAID来概括死锁处理的各种方法:预防(Prevent)、避免(Avoid)、忽略(Ignore)和检测(Detect)。1)预防死锁。通过限制请求,保证四个死锁条件中至少有一个不能发生,从而预防死锁。2)避免死锁。如果资源分配会导致一个安全的结果状态,就将资源动态地分配给进程。如果至少有一个执行序列使所有的进程都能完成运行,那么这个状态就是安全的。3)忽略死锁。忽略死锁是UNIX常采用的一种方法,这种方法只是简单地忽略死锁问题。4)检测死锁和从死锁中恢复。允许死锁发生,然后发现并解除死锁。第六章分布式系统中的死锁6.1死锁问题死锁的AND条件和OR条件资源死锁和通信死锁:在通信死锁中,进程等待的资源就是报文。资源死锁和通信死锁的真正区别在于资源死锁通常使用AND条件,而通信死锁通常使用OR条件。所谓AND条件就是当进程取得所有所需资源时,它才能继续执行;所谓OR条件就是当进程得到至少一个所需资源,它就能继续执行。在使用AND条件的系统中,死锁条件是在等待图中存在回路。但是在使用OR条件的系统中,等待图中的回路未必会引发死锁。在使用OR条件的系统中,死锁条件是存在结(knot)。一个结K是一个节点集合,对于K中的任何节点a,a能到达K中的所有节点,并且只能到达K中的节点。第六章分布式系统中的死锁6.1死锁问题死锁的AND条件和OR条件OR条件死锁图例:P1P2P3P4P5(a)无死锁P1P2P3P4P5(b)有死锁第六章分布式系统中的死锁6.2死锁的预防预防死锁的一般方法死锁预防算法是通过限制进程的资源请求来达到预防死锁的目的,都是通过打破四个死锁条件中的一个条件来实现的。1)进程在开始执行之前同时获得所有所需资源。这种方法打破了占有并等待的条件。2)所有的资源都要被赋予一个唯一的数字编号。一个进程可以请求一个有唯一编号i的资源,条件是该进程没有占用编号小于或等于i的资源。这样,就打破了循环等待的条件。3)每个进程被赋予一个唯一的优先级标识。优先级标识决定了进程Pi是否应该等待进程Pj,从而打破了不可剥夺的条件。第六章分布式系统中的死锁6.2死锁的预防基于时间戳的预防死锁方法包括两种死锁预防方案。这两种方案相互补充,这种方法常用于分布式数据库系统中。1)等待—死亡方案(wait-diescheme)。该方案是基于非剥夺方法。当进程Pi请求的资源正被进程Pj占有时,只有当Pi的时间戳比进程Pj的时间戳小时,即Pi比Pj老时,Pi才能等待。否则Pi被卷回(roll-back),即死亡。2)伤害—等待方案(wound-waitscheme)。它是一种基于剥夺的方法。当进程Pi请求的资源正被进程Pj占有时,只有当进程Pi的时间戳比进程Pj的时间戳大时,即Pi比Pj年轻时,Pi才能等待。否则Pj被卷回(roll-back),即死亡。第六章分布式系统中的死锁6.2死锁的预防基于时间戳的预防死锁方法图例说明:P1P2R1R2(a)年轻者请求年长者占有的资源P1P2R1R2(b)年长者请求年轻者占有的资源P1P2R1R2(c)年轻者请求年长者占有的资源,同时,年长者请求年轻者占有的资源第六章分布式系统中的死锁6.3死锁的检测集中式死锁检测在集中式死锁检测方法中,利用所有的局部资源分配图(或等待图)建立一个全局资源分配图(或等待图)。任何一个机器为它自己的进程和资源维持一个局部的资源分配图。整个系统只有一个协调者,它维持全局的资源分配图,全局的资源分配图是由局部资源分配图组合而成的。第六章分布式系统中的死锁6.3死锁的检测集中式死锁检测全局资源分配图(或等待图)的获得方法:1)当在局部图中有边被加入或删除时,向协调者发送一个报文,协调者根据报文信息对全局图进行更新。2)定期地更新,每个机器定期地向协调者发送自上次更新以来所有添加的边和删除的边,协调者根据报文信息对全局图进行更新。3)当协调者认为需要运行回路检测算法时,它要求所有的机器向它发送局部图的更新信息,协调者对全局图进行更新。当开始死锁检测时,协调者便查找全局等待图。如果发现回路,一个进程就会被卷回,从而打破循环等待。缺点:容易产生假死锁的情况。第六章分布式系统中的死锁6.3死锁的检测集中式死锁检测产生假死锁的图例说明:ASRB(a)机器0CST(b)机器1CSARBT(c)协调者ASRB(d)机器0T第六章分布式系统中的死锁6.3死锁的检测集中式死锁检测产生假死锁的图例说明:CST(e)机器1CSARBT(g)协调者:假死锁BASCTRB(f)协调者第六章分布式系统中的死锁6.3死锁的检测分布式死锁检测Knapp将分布式死锁检测算法分为以下四类:1)路径推动算法(path-pushingalgorithm)。先在每个机器上建立形式简单的全局等待图。每当进行死锁检测时,各个机器就将等待图的拷贝送往一定数量的邻居节点。局部拷贝更新后又被传播下去。这一过程重复进行直到某个节点获得了足够的信息来构造一个等待图以便做出是否存在死锁的结论。2)边跟踪算法(edge-chasingalgorithm)。分布式网络结构图中的回路可以通过沿图的边传播一种叫探测器的特殊信息来检测。当一个发起者得到一个与自己发送的探测器相匹配的探测器时,它就知道它在图中的一个回路里。第六章分布式系统中的死锁6.3死锁的检测分布式死锁检测Knapp将分布式死锁检测算法分为以下四类:3)扩散计算(diffusingcomputation)。怀疑有死锁发生时,事务管理器通过向依赖于它的进程发送查询启动一个扩散进程。这里不会生成全局等待图。发送查询信息时,扩散计算就增长;接收回答后,扩散计算就缩减。根据所得信息,发起者会检测到死锁的发生。4)全局状态检测(globalstatedetection)。这个方法基于Chandy和Lamport的快照方法。可以通过建立一个一致的全局状态而无需暂停当前的计算来生成一个一致的全局等待图。第六章分布式系统中的死锁6.3死锁的检测层级式死锁检测在层级式死锁检测算法中,站点被分层地放在一个树中。一个站点的死锁检测只涉及到它的下一级站点。例如,设A、B和C是控制器,而C是A和B的最低的公共祖先。假定节点Pi出现在控制器A和B的局部等待图中,那么节点Pi也必定出现在如下控制器的等待图中:(1)C控制器;(2)所有位于从C到A的路径上的控制器;(3)所有位于从C到B的路径上的控制器。而且,如果Pi和Pj出现在控制器D的等待图中,并且在D的一个下一级控制器(子控制器)的等待图中有一条从Pi到Pj的路径,那么边(Pi,Pj)一定存在于D的等待图中。第六章分布式系统中的死锁6.3死锁的检测关于死锁检测和恢复的研究方向:1)算法正确性。严格证明死锁检测算法的正确性是困难的,由于报文的传输延迟是不可预料的,所以得到一致的全局状态是很困难的。2)算法性能。需要在信息流量(监测和恢复算法的复杂性)和死锁持续时间(监测和恢复的速度)之间达成妥协。3)死锁解决。一个好而快的死锁检测算法可能并不能提供足够的信息用于解决死锁。4)假死锁。一个检测程序不仅要满足前进要求,即必须在有限的时间内发现死锁,还要满足安全要求。如果一个死锁被发现,那么这个死锁应该是确实存在的。5)死锁概率。检测和恢复算法的设计依赖于给定系统中死锁发生的概率。第六章分布式系统中的死锁6.3死锁的检测死锁检测的实例AND模型下的Chandy-Misra-Hass算法在Chandy-Misra-Hass算法中,分布式死锁检测算法使用一个特殊的报文,在等待图中该报文从一个进程传递到另一个进程,该报文称为探测报文(probemessage)。如果报文回到发起者,那么就有死锁存在。探测报文包含一个三元组(i,j,k),表示该报文是一个由进程Pi发起的死锁检测报文,现在由进程Pj所在的站点发往进程Pk所在的站点。当一个进程接收到一个探测报文时,它首先检查自己是否等待某个(或某些)进程,如果它正在等待某个(或某些)进程,它将向所有它等待的进程转发这个探测报文。第六章分布式系统中的死锁6.3死锁的检测死锁检测的实例AND模型下的Chandy-Misra-Hass算法图例说明:P1P2P3P4P5P6P7站点A站点B站点C(1,2,3)(1,3,7)(1,5,6)(1,6,1)(1,1,2)(1,3,4)(1,4,5)第六章分布式系统中的死锁6.3死锁的检测死锁检测的实例AND模型下的Chandy-Misra-Hass算法中打破死锁方法:1)一种方法是由探测报文的发起者杀死自己,但是,当有多个进程同时检测到同一个死锁时,与同一个死锁有关的多个进程会被杀死,这样做的效率会很低。2)另一种方法是每个收到探测报文的进程将自己的标识符附加到探测报文的后面,当探测报文回到发起者进程时,发起者进程选取一个具有最大标识符号码的进程杀死,即使有多个进程同时检测到同一个死锁,它们也会选择杀死同一个进程。第六章分布式系统中的死锁6.3死锁的检测死锁检测的实例AND模型下的Mitchell-Merritt算法Mitchell-Merritt算法与Chandy-Misra-Hass算法的区别:•其限制是每个进程每次只能请求一个资源。•探测报文在等待图中,沿等待方向的相反方向传送,这样的图叫反向等待图(reversedwait-forgraph)。•每当进程收到探测报文时,它将自己的标识符和探测报文发起者的标识符相比较,如果自己的标识符大于探测报文发起者的标识符,它就用自己的标识符取代探测报文发起者的标识符,自己变成探测报文的发起者。•当几个进程同时发起死锁检测时,只有一个进程能够成为唯一的探测者。第六章分布式系统中的死锁6.3死锁的检测死锁检测的实例AND模型下的Mitchel
本文标题:第六章分布式系统中的死锁
链接地址:https://www.777doc.com/doc-6345843 .html