银行家算法

这是一个C++实现的银行家算法,用于解决资源分配的安全性问题。程序首先接收用户输入的进程数和资源数,然后分别输入最大需求矩阵和已分配资源矩阵。接着,系统会检查资源分配的安全性,通过安全性算法判断是否存在安全序列。用户可以请求资源,如果请求导致系统不安全,将会被拒绝,并返回资源。程序还会展示当前的系统资源和各进程的需求、分配情况。
摘要由CSDN通过智能技术生成
#include"stdafx.h"
#include<iostream>
using namespace std;

#define MaxPro 50                      		/*最大进程数*/
#define MaxRes 100                         	/*最大资源数*/
int Available[MaxRes];						/*可用资源数组*/
int Max[MaxPro][MaxRes];					/*最大需求矩阵*/
int Allocation[MaxPro][MaxRes];				/*分配矩阵*/
int Need[MaxPro][MaxRes];					/*需求矩阵*/
int Request[MaxPro][MaxRes];				/*进程需要资源数*/
bool Finish[MaxPro];						/*系统是否有足够的资源分配*/
int p[MaxPro];								/*记录序列*/  
int m,n										/*m个进程,n个资源*/

void Init();    
bool Safe();  
void Bank();
void ShowData(int,int);
   
int main()
{
	void Init();    
	bool Safe();  
	void Bank();  
}
  
void Init()				/*初始化算法*/  
{  
	int i, j;
	cout << "请输入进程的数目:";
	cin >> m;  
	cout << "请输入资源的种类:";  
	cin >> n;  
	cout << "请输入每个进程最多所需的各资源数,按照" << m << "x" << n << "矩阵输入" << endl;
	for(i = 0; i < m; i++)  
	{
		for(j = 0; j < n; j++)
			cin >> Max[i][j];
	}
	cout << "请输入每个进程已分配的各资源数,按照" << m << "x" << n << "矩阵输入" << endl;  
	for( i = 0; i < m; i++)
	{
		for(j = 0; j < n; j++)
		{	cin >> Allocation[i][j];
			Need[i][j] = Max[i][j] - Allocation[i][j];
			if( Need[i][j] < 0 )
			{
				cout << "您输入的第" << i + 1 << "个进程所拥有的第" << j + 1 << "个资源数错误,请重新输入:" << endl;
				j--;
				continue;
			}
		}
	}
	cout << "请输入各个资源现有的数目:" << endl;
	for(i = 0; i < n; i++)
	{
		cin >> Available[i];
	}
}

void Bank()			/*银行家算法*/  
{
	int i, CusNeed, flag = 0;
	char again;
	while( 1 )
	{
		ShowData(n,m);
		cout << endl;
input:
		cout << "请输入需要申请资源的进程号(注第一个进程号为0,依次类推)" << endl;
		cin >> CusNeed;
		if( CusNeed > m )
		{
			cout << "不存在该进程,请重新输入!" << endl;
			goto input;
		}

		cout << "请输入进程所请求的各资源的数量" << endl;
		for(i = 0; i < n; i++)
		{
			cin >> Request[CusNeed][i];
		}
		for(i = 0; i < n; i++)
		{
			if( Request[CusNeed][i] > Need[CusNeed][i] )//如果用户选择的线程数的第i个资源请求数>该线程资源所需的数量
			{
				cout << "您输入的请求数超过进程的需求量!请重新输入!" << endl;
				goto input;
			}
		}
		for(i = 0; i < n; i++)//如果请求合理,那么下面
		{
			Avilable[i] -= Request[CusNeed][i];//系统资源减去申请了的
			Allocation[CusNeed][i] += Request[CusNeed][i];//线程已分配的资源加上申请了的
			Need[CusNeed][i] -= Request[CusNeed][i];//线程还需要的减去已申请到的
		}
		if( Safe() )//Available Allocation Need发生变动后是否会导致不安全
		{
			cout << "同意分配请求!" << endl;
		}
		else
		{
			cout << "您的请求已被拒绝!" << endl;
			for(i = 0; i < n; i++)
			{
				Avilable[i] += Request[CusNeed][i];
				Allocation[CusNeed][i] -= Request[CusNeed][i];
				Need[CusNeed][i] += Request[CusNeed][i];
			}
		}
		for(i = 0; i < n; i++)
		{
			if( Need[CusNeed][i] <= 0)
			{
				flag++;
			}
		}
		if( flag==n )//如果该进程各资源都已满足条件,则释放资源
		{
			for(i = 0; i < n; i++)
			{
				Available[i] += Allocation[CusNeed][i];
				Allocation[CusNeed][i] = 0;
				Need[CusNeed][i] = 0;
			}
			cout << "线程" << CusNeed << "占有的资源都被释放!" << endl;
			flag = 0;
		}
		for(i = 0; i < m; i++)//分配好了以后将进程的标识Finish改成false
		{
			Finish[i] = false;
		}
		cout << "您还想再次请求分配吗?是请按y/Y,否请按任意键!" << endl;
		cin >> again;
		if( again = 'y' || again = 'Y' )
		{
			continue;
		}
		break;
	}
}  

bool Safe()/*安全性算法*/  
{
	int i,j,k,l=0;
	int Work[MaxRes];	/*工作数组*/
	for(i=0;i<n;i++)
	{
		Work[i]=Available[i];
	}
	for(i=0;i<m;i++)
	{
		Finish[i]=false;	//Finish记录每个进程是否安全
	}  
	for(i=0;i<m;i++)	//循环查找第i个进程需要的各个资源数是否超过系统现有的对应的资源数
	{
		for(j=0;j<n;j++)
		{
			if(Need[i][j]>Work[j])	//第i个进程需要的第j个资源>系统现有的第j个资源数
			{
				break;
			}
		}
		if(j==n)	//如果第i个进程所需的各个资源数都没有超过系统现有的对应资源数
		{
			Finish[i]=true;	//给该进程的Finish记为true
			for(k=0;k<n;k++)
			{
				Work[k]+=Allocation[i][k];	//进程运行结束,已分配资源全部归还系统
			}
			p[l++]=i;	//记录进程号
		}
		else	//如果超过则继续循环下一个进程
		{
			continue;
		}
		if(l==m)	//当所有进程都能够被满足运行时
		{
			cout<<"系统是安全的"<<endl;
			cout<<"安全序列:"<<endl;
			for(i=0;i<l;i++)
			{
				cout<<p[i];
				if(i!=l-1)
				{
					cout<<"-->";
				}
			}
			cout<<""<<endl;
			return true;
		}
	}
	cout<<"系统是不安全的"<<endl;
	return false;
}  
  
void ShowData(int m,int n)//显示  
{
	int i, j;
	cout << endl;
	cout << "-------------------------------------------------------------"<<endl;
	cout << "系统可用资源数为:"; 
	for(j = 0; j < n; j++)
	{
		cout << " " << Available[j];
	}
	cout << endl;
	cout << "各进程仍需资源量:" << endl;
	for(i = 0; i < m; i++)
	{
		cout << " 进程" << i << ":";
		for(j = 0; j < n; j++)
		{
			cout << " " << Need[i][j];
		}
		cout << endl;
	}
	cout << endl;
	cout << "各进程已得到的资源量: " << endl << endl;
	for(i = 0; i < m; i++)
	{
		cout << " 进程" << i << ":";
		for(j = 0; j < n; j++)
		{
			cout << " " << Allocation[i][j];
		}
		cout << endl;
	}
	cout << endl;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值