Q
在银行家算法中,若出现下述的资源分配情况:
Process | Max | Allocation | Available |
---|---|---|---|
P0 | 0 0 4 4 | 0 0 3 2 | 1 6 2 2 |
P1 | 2 7 5 0 | 1 0 0 0 | 1 6 2 2 |
P2 | 3 6 10 10 | 1 3 5 4 | 1 6 2 2 |
P3 | 0 9 8 4 | 0 3 3 2 | 1 6 2 2 |
P4 | 0 6 6 10 | 0 0 1 4 | 1 6 2 2 |
1)该状态是否安全?
2)若进程 P2 提出请求 Request(1,2,2,2)后,系统能否将资源分配给它?
3)如果系统立即满足 P2 的上述请求,系统是否立即进入死锁状态?
A
(1) 安全的,一个可能的安全序列为 {P0,P3,P4,P1,P2}或{P0,P3,P1,P4, P2}
(2) P2 发出请求向量$Request(1, 2, 2, 2)$后,系统按照银行家算法进行检查:
$Request_2(1, 2, 2, 2) \le Need_2(2, 3, 5, 6)$
$Request_2(1, 2, 2, 2) \le Available(1, 6, 2, 2)$
系统先假定可为 P2 分配资源,并修改$Available,Allocation_2,Need_2$向量
$Available=(0,4,0,0),Allocation_2=(2,5,7,6)
Need_2=(1,1,3,4)$
进行安全性检查:此时对所有进程,条件 $Need_i \le Available(0,4,0,0)$都不成立,即 $Available$ 不能满足任何进程的请求,故系统进入不安全状态。因此,当进程 P2 提出请求 $Request(1,2,2,2)$后,系统不能将资源分配给它
(3) 系统立即满足进程 P2 的请求(1,2,2,2)后,并没有马上进入死锁状态。因为,此时上述进程并没有申请新的资源,并未因得不到资源而进入阻塞状态。只有当上述进程提出新的请求,并导致所有没执行完的多个进程因得不到资源而阻塞时,系统才进入死锁状态。
如果系统不愿意附加太多约束条件预防死锁,也不希望系统额外开销预测并避免死锁,那么,只能允许死锁出现,然后,再解除它。因此,系统需要利用某种方法来检测死锁。
资源分配图(Resource Allocation Graph)
该图是由一组结点 N 和一组边 E 所组成的一个对偶G=(N,E)
,其中:
P={P1,P2,…,Pn}
和一组资源结点R={R1, R2 ,…, Rn}
,N=PUR
e={Pi,Rj}
表示进程 Pi 请求一个单位的 $R_j$ 资源e={Rj,Pi}
表示把一个单位的资源 $R_j$ 分配给进程 PiSteps:
第一步:先看系统还剩下多少资源没分配,再看有哪些进程是不阻塞的(即系统有足够的空闲资源分配给它)
第二步:把不阻塞的进程的所有边都去掉,形成一个孤立的点,再把系统分配给这个进程的资源回收回来
第三步:重复一二步
第四步:最后,若所有的资源和进程都可以变成孤立的点。这样的图就叫做“可完全简化”
死锁定理:S 为死锁状态当且仅当 S 状态的资源分配图是不可完全简化的。
死锁检测中的数据结构
Work = Available;L = {Li| Allocation_i = 0 ∩ Request_i = 0};for(i=1; Pi not in L; i++){ if Requesti≤Work{ Work=Work+Allocation_i; Li=Pi; L=Li∪L; }}deadlock= !(L={p1, p2, …, pn});
例题
p 个进程共享 m 个同类资源,每一资源在任一时刻只能供一个进程使用,每一进程对任一资源都只能使用一有限时间,使用完便立即释放,并且每个进程对该类资源的最大需求量小于该类资源的数目。设所有进程对资源的最大需要之和小于 p+m。试证:在系统中不会发生死锁。
证明:假设系统发生死锁。
设 Max(i)为进程 i 的最大资源需求量,Need(i)为进程 i 尚需资源量,Allocation(i)为已分配资源量,则系统在任意时刻有:
$\sum_{i=1}^{p}Max(i) = \sum_{i=1}^{p} Need(i) + \sum_{i=1}^{p}Allocation(i) \lt p+ m \quad (1)$
系统发生死锁,则一方面说明所有 m 个资源都应该已经分配出去:$\sum_{i=1}^{p} Allocation(i)=m \quad (2)$
另一方面,进程将处于无限等待状态之中。
由 (1) (2) 可以得到:$\sum_{i=1}^{p} Need(i) \lt p \quad (3)$
即死锁后 p 个进程还需要的资源量之和少于 p,这就意味着此刻至少有一个进程譬如 j,已经获得了所需要的全部资源数,即$Need(j)=0$。但是系统发生死锁时,每个进程至少还需要一个资源单位,即$\sum_{i=1}^{p} Need(i) \geq p$,与等式 (3) 矛盾。此外,既然该进程已经获得了所需要的全部资源数,那么就能完成其任务并释放占有的资源,以保证系统能进一步前进,这与前面的假定死锁矛盾。
当发现有进程死锁时,常采用的两种方法是解除死锁:
按照解除死锁复杂度递增的顺序列出解除死锁的方法:
第三种和第四种方法需要选择系统付出代价最小的进程,最小代价原则:
$$R(S){min} = \sum{1\lt i\lt j\lt n} min{C_{ij}}$$
The Dead Lock