银行家算法

银行家算法

#include <iostream>
using namespace std;
//全局变量定义
int Available[3] = {3,3,2};       //可利用资源向量Available
int Max[5][3] = { {7,5,3}, {3,2,2}, {9,0,2}, {2,2,2}, {4,3,3}  };           //最大需求矩阵Max   
int Allocation[5][3] = { {0,1,0} ,{2,0,0}, {3,0,2} ,{2,1,1} ,{0,0,2} };  //已经分配矩阵
int Need[5][3] = { {7,4,3} ,{1,2,2} ,{6,0,0} ,{0,1,1} ,{4,3,1} };       //进程需求矩阵
int Request[50][100];     //M个进程还需要N类资源的资源量
int Finish[5];//系统是否有足够的资源分配给进程
int p[50];
int m=5, n=3;   //5个进程,3类资源

//安全性算法
int Safe()
{
	int i, j, l = 0;
	int Work[100]; //可提供给进程各类资源资源数组
	for (i = 0; i < n; i++)
		Work[i] = Available[i];//在执行安全算法开始时,可提供的各类资源数目=系统现有各类资源数目;Work=Available; 
	for (i = 0; i < m; i++)
		Finish[i] = 0;//表示系统是否有足够的资源分配给进程
	for (i = 0; i < m; i++)
	{
		if (Finish[i] == 1)//工作向量等于1,进程执行
			continue;
		else
		{
			for (j = 0; j < n; j++)
			{
				if (Need[i][j] > Work[j])
					break;
			}
			if (j == n)
			{
				Finish[i] = 1;
				for (int k = 0; k < n; k++)
					Work[k] = Work[k] + Allocation[i][k];//直至完成,并释放出分配给它的资源,故应执行可提供资源数量更新
				p[l++] = i;
				i = -1;
			}
			else continue;
		}
		if (l == m)
		{
			cout << "系统是安全的" << '\n';
			cout << "系统安全序列是:\n";
			for (i = 0; i < l; i++)
			{
				cout << p[i];
				if (i != l - 1)
					cout << "-->";
			}
			cout << '\n';
			return 1;
		}
	}
	return 0;
}

//银行家算法
int main()
{
	int i, j, mi;
	bool  b = true;
	Safe();
	while (1)
	{
		cout << "目前已分配资源:"<<endl;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				cout << Allocation[i][j] << "  ";
			}
			cout << endl;
		}
		cout << "进程还需资源数:"<<endl;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				cout << Need[i][j] << "  ";
			}
			cout << endl;
		}
		cout << "各个资源还可利用资源数:"<<endl;
		for (int i = 0; i < n; i++) {
			cout << Available[i] << "  ";
		}
		cout << endl;
		cout << "输入要申请的资源的进程号;\n";
		cin >> mi;
		cout << "输入进程所请求的各个资源的数量\n";
		for (i = 0; i < n; i++)
			cin >> Request[mi][i];
		for (i = 0; i < n; i++)
		{

			if (Request[mi][i] > Need[mi][i])
			{
				cout << "所请求资源数超过进程的需求量!\n";
				b = false;
				break;
			}
			if (Request[mi][i] > Available[i])
			{
				cout << "所请求资源数超过系统所有的资源数!\n";
				b = false;
				break;
			}
		}
		if (b) {
			for (i = 0; i < n; i++)
			{
				Available[i] = Available[i] - Request[mi][i];//可利用资源=可利用资源-进程需要

				Allocation[mi][i] = Allocation[mi][i] + Request[mi][i];//已分配资源=已分配资源+进程需要

				Need[mi][i] = Need[mi][i] - Request[mi][i];//进程还需资源=进程还需资源-进程需要
			}
			if (Safe())
				cout << "同意分配请求\n";
			else
			{
				cout << "对不起.你的请求被拒绝…\n";
				//可用资源,已分配资源,进程还需资源进行回滚。
				for (i = 0; i < n; i++)
				{
					Available[i] = Available[i] + Request[mi][i];

					Allocation[mi][i] = Allocation[mi][i] - Request[mi][i];

					Need[mi][i] = Need[mi][i] + Request[mi][i];
				}
			}
			for (i = 0; i < m; i++)
				Finish[i] = 0;
		}
	}

	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值