全文分四部分:
-
什么是银行家算法?
-
银行家算法中的数据结构
-
银行家算法自然语言描述
-
银行家算法流程图表示
一、什么是银行家算法?
银行家算法是操作系统的经典算法之一,用于避免死锁情况的出现。
它最初是为银行设计的(因此得名),通过判断借贷是否安全,然后决定借不借。
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。
用在操作系统中,
银行家、出借资金、客户,就分别对应
操作系统、资源、申请资源的进程。
每一个新进程进入系统时,必须声明需要每种资源的最大数目,其数目不能超过系统所拥有的的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程,若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态如果不会才将资源分配给它,否则让进程等待。
二、银行家算法中的数据结构
为了实现银行家算法,在系统中必须设置这样四个数据结构:
1)
Available向量:系统中可利用的资源数目
2)
Max矩阵:每个进程对每种资源的最大需求
3)
Allocation矩阵:每个进程已分配的各类资源的数目
4)
Need矩阵:每个进程还需要的各类资源数
其中三个矩阵间存在下述关系:
Need[i,j] = Max[i,j] - allocation[i, j]
三、银行家算法自然语言描述
将银行家算法的逻辑转化为自然语言:
设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要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等待。
四、银行家算法流程图表示
最后,用流程图表示银行家算法。
