简介
首先银行家算法属于避免死锁的一个著名算法,由Dijkstra在1965年为T.H.E系统设计的一种避免死锁产生的算法。这是由于该算法用于银行系统现金贷款的发放而得名。
基本思想
允许进程动态地申请资源,在资源分配之前,通过相应的算法确定本次资源分配后系统是否安全(不会产生死锁),若是,则进行分配,否则,让进程处于等待状态
重要概念
安全状态
某时刻,对于并发执行的n个进程,若系统能够按照某种顺序如{p1,p2…pn}来为每个进程分配所需资源,直至最大需求,从而使每个进程都可顺利完成,则认为该时刻系统处于安全状态,这样的序列为安全序列
安全状态例子
P1、P2和P3三个进程和12台磁带机,T0时刻可用资源为3:
进程 | 最大需求 | 已分配 | 尚需 |
---|---|---|---|
P1 | 10 | 5 | 5 |
P2 | 4 | 2 | 2 |
P1 | 9 | 2 | 7 |
那么此刻如果以{P2,P1,P3} 的顺序来执行,就可以顺利运行(系统就可以救活)
执行的过程如下表:
进程 | 空闲资源 |
---|---|
P2 | 5 |
P1 | 10 |
P3 | 12 |
如果在T0 状态不按安全序列进行分配,可能会导致系统进入一个不安全状态,例如在T0状态下P3中申请1台磁带机。
银行家算法思想简框图
Created with Raphaël 2.2.0 开始 资源请求合法性检查 进行尝试性的资源分配 分配安全吗? 结束 撤销本次资源分配 不合法性处理 yes no yes no
银行家算法的数据结构
可用资源向量 Available[m]
m为系统中资源种类数,Available[j]=k表示系统中第j类资源数为k个。
最大需求矩阵 Max[n,m]
n为系统中进程数,Max[i,j]=k表示进程i对j类资源的最大需求数为中k。
分配矩阵 Allocation[n,m]
它定义了系统中每一类资源当前已分配给每一进程资源数, Allocation[i,j] = k表示进程i已分得j类资源的数目为k个。
需求矩阵 Need[n,m]
它表示每个进程尚需的各类资源数,Need[i,j]=k 表示进程i 还需要j类资源k个。Need[i,j]=Max[i,j] – Allocation[i,j]。
进程Pi的请求向量Requesti
如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。
银行家算法具体框图
Created with Raphaël 2.2.0 开始 Requesti ≤ Need[i] Request[i]≤Available Available= Available-Requesti Allocation[i]= Allocation[i]+Requesti Need[i]=Need[i]-Requesti 分配安全吗? Available= Available+Requesti Allocation[i]= Allocation[i]-Requesti Need[i]=Need[i]+Requesti 结束 撤销本次资源分配 请求进程等待 资源请求非法 yes no yes no yes no
银行家算法具体步骤描述
当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等待。
安全性算法
由银行家算法改进更通用的安全性算法
安全性算法原理简框图
Created with Raphaël 2.2.0 开始 寻找一个非阻塞的进程? 运行完成,释放资源 所有进程节点都可以运行完成吗? 系统安全 系统不安全 yes no yes no
安全性算法的数据结构
工作向量Work
它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素
Finish
它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]:= False; 当有足够资源分配给进程时, 再令Finish[i]:= True。
安全性算法具体框图
Created with Raphaël 2.2.0 开始 Work=Available; All Finish=FALSE; Finish[i]=false &&Need[i]≤work? Work=Work+Allocation[i]; Finish[i]=TRUE; All finish==TRUE? Return 安全 Return 不安全 yes no yes no
安全性算法具体步骤描述
- (1) 设置两个向量: 在执行安全算法开始时,Work∶=Available; Finish[i]:= False;
- (2) 从进程集合中找到一个能满足下述条件的进程: ① Finish[i]= False; ② Need[i,j]≤Work[j];
若找到, 执行步骤(3), 否则,执行步骤(4)。 - (3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]∶= Work[i]+
Allocation[i, j]; Finish[i]∶= true; go to step 2; - (4) 如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。
例子
假定系统中有五个进程{P0、P1、P2、P3、P4}和三种类型资源{A、B、C},每一种资源的数量分别为10、5、7。如下所示
进程\资源情况 | Max A B C | Allocation A B C | Need A B C | Available A B C |
---|---|---|---|---|
P0 | 7 5 3 | 0 1 0 | 7 4 3 | 3 2 2 |
P1 | 3 2 2 | 2 0 0 | 1 2 2 | |
P2 | 9 0 2 | 3 0 2 | 6 0 0 | |
P3 | 2 2 2 | 2 1 1 | 0 1 1 | |
P4 | 4 3 3 | 0 0 2 | 4 3 1 |
- T0时刻是否安全?
从表中可找出一个序列(P1 、 P3、 P4 、 P2 、 P0)使各进程顺序地一个个地执行完成
|进程\资源情况|Work
A B C|Need
A B C|Allocation
A B C|Work+Allocation
A B C|Finish|
|————- |————- |————- |————- |————- |————- |
|P1|3 2 2|1 2 2|2 0 0|5 3 2|ture|
|P3|5 3 2|0 1 1|2 1 1|7 4 3|ture|
|P4|7 4 3|4 3 1|0 0 2|7 4 5|ture|
|P2|7 4 5|6 0 0|3 0 2|10 4 7|ture|
|P0|10 4 7|7 4 3|0 1 0|10 5 7|ture|