银行家算法(避免死锁最具代表性的算法)

银行家算法(数据结构,算法思想)

  • 银行家算法中的数据结构:
    ① 可利用资源向量 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

猜你喜欢

转载自blog.csdn.net/wsq119/article/details/82219128
今日推荐