银行家算法
一种解决死锁的方案
基本思想:
计算机 | 银行 |
---|---|
系统资源 | 贷款 |
申请资源的进程 | 借款人 |
操作系统 | 银行家 |
模拟银行贷款,银行家不可能满足所有借款人所要求的借款总额,所以当某借款人提出借款时,银行家必须判断如果将款借出,会不会导致资金周转不灵。若会,则不借;否则,就借。
算法过程:
对每一个资源申请进行检查,看如果满足该申请是否会导致不安全状态。若是则不满足该申请,否则满足。
单项资源的银行家算法:
系统状态如下表:
进程名 | 已有数目 | 最大需求 | 尚需数目 |
---|---|---|---|
a | 1 | 4 | 3 |
b | 2 | 5 | 3 |
c | 1 | 6 | 5 |
d | 2 | 7 | 5 |
剩余资源 | 4 |
---|---|
观察表可得,此时系统剩余资源为4,而a、b尚需资源为3,可以满足,所以就可以先分配给a,待a进程执行完成后回收资源,剩余资源就会变为5。
如果一开始把剩余资源分给c或者d,c和d获得资源并没有满足它们的最大需求,所以就不会执行完成释放资源,此时所有进程都无法执行下去,剩余资源为0(状态不安全),陷入了死锁的局面。
银行放贷——>借款人收到钱后完成项目——>借款人还贷并附带利息——>银行用收到的利息和贷款继续放贷(良性循环)
多项资源的银行家算法:
-
准备工作
- 设置资源的已分配矩阵R
- 设置尚需资源分配矩阵Q
- 设置可分配资源向量available
-
此时某进程对某一种资源提出申请,假定预先分配给它
-
修改1中的信息(矩阵和向量)
-
在矩阵Q中找到一行,使该行向量小于等于available
- 若不存在——说明没有进程能够获得全部资源运行到完成
-
假设被选中的那一行的进程获得资源并运行结束,将它占有的资源全部加入向量available
- 满足尚需资源矩阵的一行之后,将已分配矩阵对应的行加入到available向量
-
重复4、5,直到所有进程都完成,则系统是安全的,可以分配;或者发生死锁,则预先分配是不安全的,应不予分配
例:假设有四类资源R1、R2、R3、R4;五个进程a、b、c、d、e;
已分配矩阵 | 尚需资源矩阵 |
---|---|
最大需求矩阵 | available向量 |
(2,2,1,2) |
- 对比available向量和尚需资源矩阵,available向量目前只能满足c进程;
- 满足c进程之后,c行在尚需资源矩阵Q里变为0,available向量变为(2,2+3,4+1,2)=(2,5,5,2);
- 可以满足进程a或e,进而满足b或d,直到全部结束;