6.1
1、死锁发生的条件:
1) 互斥。正如我们第五章所讨论的,互斥是一种资源分配方式,保证同一个资源在同一时刻最多只能被一个进程占用,它用于防止多个进程同时共享访问不可同时共享访问的资源。
2) 不可剥夺的资源分配。系统将一个资源的访问权分配给某一个进程后,系统不能强迫该进程放弃对该资源的控制权。
3) 占有并等待。必然有一个进程占用了至少一个资源,同时在等待获取被其他进程占用的资源。
4) 循环等待。在等待图中有一个循环路径。
2、处理死锁的策略死锁:
可以使用PAID来概括死锁处理的各种方法:预防(Prevent)、避免(Avoid)、忽略(Ignore)和检测(Detect) 。
1)预防死锁。通过限制请求,保证四个死锁条件中至少有一个不能发生,从而预防死锁。
2)避免死锁。如果资源分配会导致一个安全的结果状态,就将资源动态地分配给进程。如果至少有一个执行序列使所有的进程都能完成运行,那么这个状态就是安全的。
3)忽略死锁。忽略死锁是UNIX常采用的一种方法,这种方法只是简单地忽略死锁问题。
4)检测死锁和从死锁中恢复。允许死锁发生,然后发现并解除死锁。
3、死锁的AND条件和OR条件:
资源死锁和通信死锁:在通信死锁中,进程等待的资源就是报文。资源死锁和通信死锁的真正区别在于资源死锁通常使用AND条件,而通信死锁通常使用OR条件。
所谓AND条件就是当进程取得所有所需资源时,它才能继续执行;所谓OR条件就是当进程得到至少一个所需资源,它就能继续执行。
在使用AND条件的系统中,死锁条件是在等待图中存在回路。但是在使用OR条件的系统中,等待图中的回路未必会引发死锁。在使用OR条件的系统中,死锁条件是存在结(knot)。一个结K是一个节点集合,对于K中的任何节点a,a能到达K中的所有节点,并且只能到达K中的节点。
6.2
1、基于时间戳的预防死锁方法:
包括两种死锁预防方案。这两种方案相互补充,这种方法常用于分布式数据库系统中。
1)等待—死亡方案(wait-die scheme)。该方案是基于非剥夺方法。当进程Pi请求的资源正被进程Pj占有时,只有当Pi的时间戳比进程Pj的时间戳小时,即Pi比Pj老时,Pi才能等待。否则Pi被卷回(roll-back),即死亡。
2)伤害—等待方案(wound-wait scheme)。它是一种基于剥夺的方法。当进程Pi请求的资源正被进程Pj占有时,只有当进程Pi的时间戳比进程Pj的时间戳大时,即Pi比Pj年轻时,Pi才能等待。否则Pj被卷回(roll-back),即死亡。
6.3
1、Mitchell-Merritt算法与Chandy-Misra-Hass算法的区别:
其限制是每个进程每次只能请求一个资源。 探测报文在等待图中,沿等待方向的相反方向传送,这样的图叫反向等待图(reversed wait-for graph)。 每当进程收到探测报文时,它将自己的标识符和探测报文发起者的标识符相比较,如果自己的标识符大于探测报文发起者的标识符,它就用自己的标识符取代探测报文发起者的标识符,自己变成探测报文的发起者。 当几个进程同时发起死锁检测时,只有一个进程能够成为唯一的探测者。