银行家算法(数据结构,算法思想)
银行家算法中的数据结构:
① 可利用资源向量 Available
② 最大需求矩阵Max
③ 分配矩阵 Allocation
④ 需求矩阵 Need
三个矩阵间存在下述关系:Needp[i,j] = Max[i,j] –Allocation[i,j]
算法思想:
(1)如果Request i[j] <= Need[i,j],便转向步骤 (2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request i[j] <= Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的值:Available[j]:=Available[j] – Request i[j]; Allocation[i,j]:=Allocation[i,j] + Request i[j]; Need[i,j]:=Need[i,j] – Request i[j];
(4)系统执行安全性算法,减产此次算法分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
安全性算法:
(1)设置两个向量:①工作向量Work,表示系统可提供给进程继续运行所需的各类资源数 目,它含有m个元素,在执行安全算法开始时,Work:=Available。 ② 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 |
试问:
⑴ 该状态是否安全?
⑵ 若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?
答: ⑴该状态是安全的,因为存在一个安全序列< P0P3P4P1P2>。下表为该时刻的安全序列表。
Process | Work | Need | Allocation | Work+Allocation | Finish |
---|---|---|---|---|---|
P0 | 1 6 2 2 | 0 0 1 2 | 0 0 3 2 | 1 6 5 4 | true |
P3 | 1 6 5 4 | 0 6 5 2 | 0 3 3 3 | 1 9 8 7 | true |
P4 | 1 9 8 7 | 0 6 5 6 | 0 0 1 4 | 1 9 9 11 | true |
P1 | 1 9 9 11 | 1 7 5 0 | 1 0 0 0 | 2 9 9 11 | true |
P2 | 2 9 9 11 | 2 3 5 6 | 1 3 5 4 | 3 12 14 17 | true |
答:⑵若进程P2提出上述请求,系统不能将资源分配给它,因为分配之后系统将进入不安全状态。
P2请求资源:P2发出请求向量Request2(1,2,2,2),系统按银行家算法进行检查:
①Request2(1,2,2,2)≤Need2(2,3,5,6);
②Request2(1,2,2,2)≤Available(1,6,2,2);
③系统暂时先假定可为P2分配资源,并修改P2的有关数据,如下表:
Allocation | Need | Available |
---|---|---|
2 5 7 6 | 1 1 3 4 | 0 4 0 0 |