操作系统上机练习:使用C++实现简单的银行家算法

题目要求程序:
给定/进程数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;
}

//本算法只用于判断能否分配,并不会实质上分配
复制代码
Powered By Valine
v1.4.4