操作系统--避免死锁--银行家算法详解

2021年4月14日 66点热度 0条评论 来源: 鸟鸟Wink.

避免死锁的经典算法–银行家算法
此算法的根本实质就是在分配资源以后可以找到一组进程的安全序列来保证系统是处于安全状态的,不会形成死锁。
1、银行家算法的思路
—判断进程申请的资源进程的请求是否合法(请求的资源数≤还需要的资源数=需要的最大资源数-已经分配给该进程的此类资源)
—有足够空闲,没有则拒绝分配
—如果有足够空闲:
假设将资源分配给进程,判断假设分配后的系统状态,安全则分配,不安全则拒绝分配。
2、银行家算法中的数据结构
可利用资源向量Available
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available [ j ]=K,则表示系统中现有Rj类资源K个。
最大需求矩阵Max
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max [ i,j ]=K,则表示进程i需要Rj类资源的最大数目为K。
分配矩阵Allocation
这也是一个nxm的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[ i , j ]=K,则表示进程i当前已分得Rj类资源的数目为K。
需求矩阵Need
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need [ i , j ]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。其中不难理解Need [ i , j ] =Max [ i , j ] -Allocation [ i , j ]。
3、银行家算法的具体步骤
设Requesti是进程Pi的请求向量,如果Requesti[ j ]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查
(1)如果Requesti[ j ] ≤Need [ i , j ],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Requesti[ j ]≤Available [ j ],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
(3)系统试探着把资源分配给进程P,并修改下面数据结构中的数值:
Available[ j ]∶=Available [ j ] -Requesti[ j ];
Allocation[ i , j ]∶=Allocation [ i , j ] +Requesti[ j ];
Need [ i, j ]: =Need [ i , j ] -Requesti[ j ];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程P;以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程P等待。
4、安全性算法(找到安全序列的方法)
1、设置两个向量:
(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[ i ]:=Work[ i ]+Allocation[ i , j ];
Finish[ i ]:=true;
go to step 2;
(4)如果所有进程的Finish[ i ]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
安全性算法的实质就是在一组进程中先随机选择一个进程然后满足要求条件的分配资源,执行完进程以后释放后的剩余全部的资源可以满足余下进程组中另一个随机进程执行时所需要的资源,然后重复上述过程,可以让进程组中的所有进程都按照一定分配资源顺序全部完成任务,从而不发生死锁。

    原文作者:鸟鸟Wink.
    原文地址: https://blog.csdn.net/scarificed/article/details/115705660
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。