题目要求程序:
给定/进程数N,资源种类数M,和Avaliable、Max、Need数组,用银行家算法判断当前状态是否为安全状态。
给定一个进程的资源请求数组R,用银行家算法判断这个请求是否可行。
该程序存在部分漏洞,仅用作思路引导
#include <iostream>
#include <cstdlib> /**输入格式:第1行 N个进程,M类资源
*第2-(1+N)行的第1列为进程号,2-(M-1)列为Avaliable,M-(2M-1)列为Max,(2M)-(3M-1)列为Need
再根据提示 输入i个进程请求资源**/
//Available[j]= Available[j]-R[i][j]
using namespace std; //Need[i][j]= Need[i][j]-R[i][j]
const int L = 1010; //allocation[i][j]=Max[i][j]-Need[i][j]
int n, m;
int Available[L], R[L];
int Max[L][L], Need[L][L], Allocation[L][L];
bool Finish[L];
void input();
bool isSystemSafe(); //安全性算法
void bankerAlgorithm(); //银行家算法
int main()
{
input();
bankerAlgorithm();
return 0;
}
void input()
{ //读入数据
cin >> n >> m; //n:进程数(行),m:资源数(列)
for (int i = 0; i < m; i++)
{
cin >> Available[i]; //给定可用的资源数,为一位数组
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> Max[i][j]; //资源的最大需求量
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> Need[i][j]; //给定目前需要的资源量
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
Allocation[i][j] = Max[i][j] - Need[i][j]; //计算出Allocation
}
}
}
//安全性算法-------------
bool isSystemSafe()
{
int work[L]; //用于值传递,把available的数放到work后进行安全性测试
int i = 0, isSafe = 0;
for (int i = 0; i < m; i++)
{
work[i] = Available[i];
}
for (int i = 0; i < n; i++)
{
Finish[i] = false; //初始化
}
//判断第i个进程所有资源是否都安全
while (i < n)
{
for (int j = 0; j < m; j++)
{
if (Finish[i] == false && Need[i][j] <= work[j])
{
isSafe++; //如果安全,则++
}
else
break;
}
if (isSafe == m)
{ //m个进程全部安全
Finish[i] = true;
for (int j = 0; j < m; j++)
{
work[j] += Allocation[i][j]; //确认安全,加上allocation一起返还资源
}
i = 0; //如果第i个进程安全,则重新进行判断
}
else
i++; //当进程不安全时运行此处,可添加一个标记
}
if (i != n)
{ //此处可把i替换为标记
cout << "系统处于不安全状态" << endl;
return false;
}
else
cout << "当前安全状态" << endl;
return true;
}
//银行家算法
void bankerAlgorithm()
{
int num;
cout << "输入请求资源的进程(如0 表示进程P1)";
cin >> num;
cout << endl;
cout << "输入进程的请求所有资源数量R(共m类)";
for (int j = 0; j < m; j++)
{
cin >> R[j];
}
for (int j = 0; j < m; j++)
{
if (R[j] > Need[num][j] || R[j] > Available[j])
{ //判断是否请求资源数量可行
cout << "请求量大于Need" << endl;
exit(0);
}
}
for (int j = 0; j < m; j++) //将资源分配给进程
{
Available[j] -= R[j];
Allocation[num][j] += R[j];
Need[num][j] -= R[j];
}
if (!isSystemSafe())
{ //将已分配给进程的资源作废
for (int j = 0; j < m; j++)
{
Available[j] += R[j];
Allocation[num][j] -= R[j];
Need[num][j] += R[j];
}
}
else
cout << "请求可行" << endl;
}
//本算法只用于判断能否分配,并不会实质上分配
复制代码