利用银行家算法避免死锁的介绍与举例
一、数据结构
1.多个进程: { P0,P1,P2,P4 } 代表1,2,3,4四个需要临界资源的进程
2.几种资源:{ A, B ,C } 代表A,B,C三种临界资源
3.Max:最大需求矩阵(进程完成执行需要的各资源总量)
Allocation:分配矩阵(某个进程现在已经拥有的各资源量)
Need:需求矩阵(某个进程仍需要的各资源量)
Available:可利用资源向量 (系统保有的供分配的资源量)
其中:Need = Max - Allocation ,很容易理解嘛,仍然需要的量等于总需求量减去拥有的量
二、银行家算法
设 Requesti 是进程 Pi 的请求向量,如果 Requesti [j] = K,表明进程需要K个Rj类型的资源。当Pi发出资源请求后,系统按照如下步骤进行检查:
(1)如果 Requesti [j] <= Need[i,j],便转向步骤(2),否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。
(2)如果 Requesti [j] <= Available[j],便转向步骤(3),否则表示尚无足够资源,Pi 需等待。
(3)系统试探性的把资源分配给进程Pi ,并修改下面数据结构中的数值:
Available[j] = Available[j] - Requesti [j];
Allocation[i,j] = Allocation[i,j] + Requesti [j];
Need[i,j] = Need[i,j] - Requesti [j];
(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态(不会产生死锁),若安全,才正式将资源分配给进程Pi ,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi 等待。
三、安全性算法
(1)设置两个向量:
1> 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行算法开始时,Work = Available;
2> Finish:它表示系统是否有足够的资源分配给进程,使之完成运行。开始时先做Finish[i] = false;当有足够资源分配给进程时,再令Finish[i] = true;
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i] = false;
②Need[i,j] <= Work[j];
若找到,执行步骤(3),否则,执行步骤(4)
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j] = Work[j] + Allocation[i,j];
Finish[i] = true;
go to step 2;
(4)如果所有进程的Finish[i] = true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
四、银行家算法举例
在银行家算法中,若出现下述分配情况,试问:
Process | Allocation | Need | Available |
P0 | 0, 0, 3, 2 | 0, 0, 1, 2 | 1, 6, 2, 2 |
P1 | 1, 0, 0, 0 | 1, 7, 5, 0 | |
P2 | 1, 3, 5, 4 | 2, 3, 5, 6 | |
P3 | 0, 3, 3, 2 | 0, 6, 5, 2 | |
P4 | 0, 0, 1, 4 | 0, 6, 5, 6 |
(1)该状态是否安全?
答:安全,可以按照P0 - P3 - P4 - P1 - P2或者P0 - P3 - P1 - P4 - P2又或者P0 - P3 - P1 - P2 - P4的顺序,可以顺利执行完所有进程,并不会出现死锁的情况
(首先看表发现 Available > Need 的进程只有P0,所以先执行P0,P0执行完成后回收资源(1,6,2,2)+ (0,0,3,2), 现在Available变成了(1,6, 5,4),再看发现只有P3可以执行,再执行P3,Available增加到了(1,9,8,6),可以执行P1和P4,两者都可以,这里选择先执行P4,后Available变成了(1,9,9,10),再执行P1,Available增到(2,9,9,10),最后执行P2)
(2)若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?
答:不能,按照银行家算法,首先检查Requesti [j] 是否小于等于 Need[i,j],在这里(1,2,2,2) < (2,3,5,6)满足条件,则再判断Requesti [j] 是否小于等于 Available[j],这里1,2,2,2) <(1,6,2,2)满足!然后便试探性的将资源分配给P2,此时P2的Allocation项变为(2,5,7,6),Need项变为(1,1,3,4),Available项变为(0,4,0,0),执行安全性算法,第一步就发现找不到一个进程使得Need[i,j] <= Work[j];所以安全性检查失败,这个Request请求会造成死锁,系统将处于不安全状态,故本次试探分配作废,恢复原来的资源分配状态,让进程P2等待
笔记:
若有m个资源,n个进程,各进程至少需要1个资源(到底需要几个不确定),那么保证系统无死锁的条件是:∑ni=1Max < m+n-1