银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它最初是为银行借贷系统服务的,以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。
银行家算法中的数据结构
表示形式 | 含义 | |
---|---|---|
Available(可用资源数组) | Available[j]=k | 现有资源k的数目为k |
Max(最大需求矩阵) | Max[i,j]=k | 进程i对资源j的最大需求数目为k |
Allocation(分配矩阵) | Allocation[i,j]=k | 进程 i 当前已分得的资源 j 的数目为 k |
Need(需求矩阵) | Need[i,j]=k | 进程 i 尚需分配的资源 j 的数目为 k |
进程
有四个进程{P1,P2,P3,P4},还有四类进程运行时需要使用的资源{A,B,C,D}
Allocation Max Available A B C D A B C D A B C D P1 0 0 1 4 0 6 5 6 1 5 2 0 P2 1 4 3 2 1 9 4 2 P3 1 3 5 4 1 3 5 6 P4 1 0 0 0 1 7 5 0
我们会看到一个资源分配表,要判断是否为安全状态,首先先找出它的Need,Need即Max(最多需要多少资源)减去Allocation(原本已经分配出去的资源),计算结果如下:
Need A B C D 0 6 4 2 0 5 1 0 0 0 0 2 0 7 5 0
然后加一个全都为false的字段
FINISH P1 flase P2 flase P3 flase P4 flase
接下来找到Need比Available小的(A与A比较、B与B比较......要求全部满足)
Need Available A B C D A B C D P1 0 6 4 2 1 5 2 0 P2 0 5 1 0 <- P3 0 0 0 2 P4 0 7 5 0
此时P2 FINISH的false要改成true(Completed)
FINISH P1 flase P2 true P3 flase P4 flase
P2进程运行完后要释放资源,此时的Available应为Need(P2运行前的)加上Allocation(P2运行前的)
Need Available A B C D A B C D P1 0 6 4 2 1 5 2 0 P2 0 0 0 0 + 1 4 3 2 P3 0 0 0 2 ———————————— P4 0 7 5 0 2 9 5 2
接下来继续往下找,发现P3的需求为0002,小于能用的2952,所以资源配置给他再回收
Need Available A B C D A B C D P1 0 6 4 2 2 9 5 2 P2 0 0 0 0 P3 0 0 0 2 P4 0 7 5 0
接下来继续往下找,发现P3的需求为0002,小于能用的2952,(P1的0642也满足条件)所以资源配置给他再回收
Need Available A B C D A B C D P1 0 6 4 2 P2 0 0 0 0 2 9 5 2 P3 0 0 0 0 + 1 3 5 4 P4 0 7 5 0 —————————————— 3 12 10 6
依此类推,做完P4→P1,当全部的FINISH都变成true时,就是安全状态。