1.背景知识
①银行家算法是死锁避免的经典算法,其核心思想是:进程动态地申请资源,每次申请资源时系统都执行安全状态检查算法判断本次申请是否会造成系统处于不安全状态,如果不安全则阻塞进程;如果安全状态,则完成资源分配。
②安全状态检查算法的思想是找到一个安全序列,使所有进程都能执行完毕。如果找到,则处于安全状态,否则为不安全状态。
下列有个生活实例能帮你很快了解银行家算法的应用情形:
如果有3个公司甲、乙、丙,分别需要200万、100万、300万作为项目启动资金,并已分别向银行贷款120万、60万、200万,现银行只能再拿出共60万贷款给这3个公司,问银行怎样分配这60万才能满足甲、乙、丙的总需求。
公司 | 总需求 | 已贷款 | 还需 |
---|---|---|---|
甲 | 200万 | 120万 | 80万 |
乙 | 100万 | 60万 | 40万 |
丙 | 300万 | 200万 | 100万 |
假设把60万都给甲,那么甲有了180万,但还是没有达到200万,银行也没更多的钱给乙和丙,这时就产生了一个死锁问题。
如果银行先给乙40万,乙就达到了需求100万,等乙完成项目还给银行100万,银行就有120万能给甲和丙,这样就能顺利解决这个
问题。即贷款顺序为乙->甲->丙。
上述银行分配贷款的过程就是银行家算法应用的过程。
2.主要变量解释及银行家算法流程图
以上述问题为例:
int Available[100];//可利用资源数组(贷款总数60万)
int Max[50][100];//最大需求矩阵(总需求)
int Allocation[50][100];//分配矩阵(已贷款)
int Need[50][100];//需求矩阵(还需)
int Request[50][100];//第m个进程还需要n类资源的数量(公司主动请求贷款量,上述未体现)
int p[50];//各进程(各公司)
3.代码实现
#include <iostream>
using namespace std;
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];//第m个进程还需要n类资源的数量
int Finish[50];//表示系统是否有足够的资源分配给进程来使之运行完成
int p[50];//各进程
int m, n;//m个进程,n类资源
bool safe()//安全性算法
{
int i, j, v = 0;
int Work[100];//可利用资源数组
for (i = 0; i < n; i++)
Work[i] = Available[i];
for (i = 0; i < m; i++)
Finish[i] = false;