银行家算法是学习计算机操作系统中最重要的算法之一,银行家算法又称资源分配拒绝法,是用来避免死锁的。
以下用例题来解释银行家算法
题目假设:
有四家公司:进程P0、进程P1、进程P2、进程P3
一间银行:名叫系统的银行,银行有三个金库A、B、C
题目情景:四家公司因为企业发展需要,都需要向银行进行贷款,每个公司需要贷款金额不同,银行贷款给各个公司所使用的金库也不同。
此时此刻,各公司所需要的参数如公司总贷款(Claim)、公司已贷金额(Allocation)的表格所示:
公司 | 公司总贷款(Claim) | 公司已贷金额(Allocation) |
A B C |
A B C |
P0 | 3 2 2 | 1 0 0 |
P1 | 6 1 3 | 5 1 1 |
P2 | 3 1 4 | 2 1 1 |
P3 | 4 2 2 | 0 0 2 |
银行还剩金额(Available):
银行还剩金额(Available) |
A B C |
1 1 2 |
银行(系统)为什么要给公司(进程)这样分配金额(资源)?
为了避免分配金额(资源)出现公司(进程)循环等待(死锁)的情况
什么是循环等待?就是P0公司在等待着银行分配金额,但银行的钱不够了,银行的钱都在公司P1了,但公司P1需要完成项目的钱还远远不够,要等公司P2的项目完成了把钱还给银行才可能够。
银行现在手里三个金库A、B、C都还有钱,但银行把钱分给哪个公司最合理,能最快收回资金呢?如图所示,各个公司的还需贷款(Claim-Allocation)为
公司还需贷款(Claim-Allocation) |
A B C |
P0 | 2 2 2 |
P1 | 1 0 2 |
P2 | 1 0 3 |
P3 | 4 2 0 |
因为银行剩余金额(Available)=(1,1,2)>公司P1还需要的贷款金额(Claim-Allocation)=(1,0,2)
所以银行可以把手上剩余的钱分配给公司P1
假设当银行把手上的剩余金额(Available)分配给公司P1,即银行Available=(1,1,2)-公司P0(Claim-Allocation)=(1,0,2)=(0,1,0)
此时,公司P1获得了项目所需的全部资金,即公司已经获得的资金(Calim)=(6,1,3)。当公司P1完成项目后,就把贷款的金额还给银行了。
此时银行三个金库的金额为(0,1,0)加上刚刚公司P1还回来的金额(6,1,3),即(6,2,3)
银行还剩金额(Available) |
A B C |
6 2 3 |
此时,各公司的情况如下
公司 | 公司总贷款(Claim) | 公司已贷金额(Allocation) |
A B C |
A B C |
P0 | 3 2 2 | 1 0 0 |
P2 | 3 1 4 | 2 1 1 |
P3 | 4 2 2 | 0 0 2 |
公司还需贷款(Claim-Allocation) |
A B C |
P0 | 2 2 2 |
P2 | 1 0 3 |
P3 | 4 2 0 |
因为银行剩余金额(Available)=(6,2,3)>公司P0(Claim-Allocation)=(2,2,2)和公司P2(Claim-Allocation)=(1,0,3)和公司P3(Claim-Allocation)=(4,2,0)所以银行可以把手上剩余的钱分配给公司P0或者公司P2或者公司P3
假设当银行把手上的剩余金额(Available)分配给公司P0,即银行Available=(6,2,3)-公司P0(Claim-Allocation)=(2,2,2)=(4,0,1)
此时,公司P0获得了项目所需的全部资金,即公司已经获得的资金(Calim)=(3,2,2)。当公司P0完成项目后,就把贷款的金额还给银行了。
此时银行三个金库的金额为(4,0,1)加上刚刚还剩下的(3,2,2),即(7,2,3)
银行还剩金额(Available) |
A B C |
7 2 3 |
此时,各公司的情况如下
公司 | 公司总贷款(Claim) | 公司已贷金额(Allocation) |
A B C |
A B C |
P2 | 3 1 4 | 2 1 1 |
P3 | 4 2 2 | 0 0 2 |
公司还需贷款(Claim-Allocation) |
A B C |
P2 | 1 0 3 |
P3 | 4 2 0 |
因为银行剩余金额(Available)=(7,2,3)>公司P2(Claim-Allocation)=(1,0,3)和公司P3(Claim-Allocation)=(4,2,0)
所以银行可以把手上剩余的钱分配给公司P2或者公司P3
银行分配给公司P2后,收回来的钱又可以分配给公司P3还需贷款的钱,这样,就把四个公司的项目所需资金都解决了
解决顺序是公司P1→公司P0→公司P2→公司P3,或者公司P1→公司P0→公司P3→公司P2,或者其他,有很多
这个顺序就是银行家算法中的安全序列,此时银行处于安全状态
至此,整个计算过程就结束了。
在操作系统的计算题考试中,常出现的几个问题是:
①系统是否处于安全状态,即看一开始的时候银行(系统)还剩下的金额(资源)够不够分配给其中的一个公司(进程),或者分配之后返还的金额够不够再进行下一轮的分配(一般题目不会这样出,这是死题)
②求出系统的安全序列,就如上面的解释进行计算即可
③问某个公司(假设还需贷款(Claim-Allocation)=(1,1,1))能不能申请金额(资源),但银行(系统)只有(0,1,0)的储备资金,所以是不能申请
④各个进程还需要的资源数,即(Claim-Allocation)
本例题是采用
操作系统教程(第五版)费翔林 骆斌 编著
P184 23题
如有问题可私聊博主或私邮博主
感谢!