⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 银行家算法.cpp

📁 银行家算法是一种避免进程死锁的算法。某一进程申请资源时
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////// 
//      文件名 : 银行家算法.cpp
//      目的及主要功: 银行家算法实现 
//      创建日期 :2007/11/10
//      修改日期 :
//      作者 : 陈宁 
//      修改者 :     
//////////////////////////////////////////////////////////////////////////// 

#include<stdio.h>
#include<iostream>
#include<string>

using namespace std;

#define M 5   //进程数
#define N 5   //资源数

int s[M][N],f[M][N],a[N],r[N];  //尚需、已分、可用、请求
int flag[M];  //完成标记
int use[N];
int k=-1;

//----------------------------------------------------------------
int IsSafe(int m,int n)
{ 
	int what=0;
	
	for(int i=0;i<m;i++)  //外循环
	{
		for(int v=0;v<m;v++)  //内循环
		{	
			if(flag[v]==0)  //进程没完成
			{  
				int j;
				for( j=0;j<n;j++)
				{
					//a[j]表示系统可用资源,如果资源不够,换下一个进程	
					if(s[v][j]>a[j]) break; 
				}
				if(j==n)//该进程可以完成
				{
					for(int w=0; w<n; w++)
						use[w]=a[w];
					for(int ee=0; ee<n; ee++)
						a[ee]=f[v][ee]+a[ee];  //更新系统可用
					flag[v]=1;          //置标志
					what=1;
					cout<<"系统可用资源";
					for(int aa=0;aa<n;aa++)
						cout<<a[aa]<<"  "; 
					cout<<endl;
				}
			}
		}
		if(what==0) return 0;
	}
	return 1;
}

void BankManage(int m,int n)
{
	for(int j=0;j<n;j++)
	{
		if(s[k][j] < r[j])
		{
			cout<<"申请出错!";  //请求大于尚需
			return;
		} 
	}
	
	for(int j0=0;j0<n;j0++)
	{
		if(a[j0] < r[j0]) 
		{
			cout<<"申请出错!";   //请求大于系统可用
			return;
		}  
	}
	
	for(int jj=0;jj<n;jj++)  	//试分配
	{
		a[jj]=a[jj]-r[jj];        //系统可用资源a[jj]
		use[jj]=a[jj];
		f[k][jj]=f[k][jj]+r[jj];  //已分
		s[k][jj]=s[k][jj]-r[jj];  //尚需
	}
	
	cout<<"试分后系统可用资源:";
	for(int zz=0;zz<n;zz++)
		cout<<a[zz]<<"   "; 
	cout<<endl<<endl;
	
	int pk;
	for(pk=0;pk<n;pk++)
	{
		if(s[k][pk]!=0)
			break;
	}
	
	if (pk==n) 
	{
		flag[k]=1;
		for(int eo=0;eo<n;eo++)
			a[eo]=f[k][eo]+a[eo];  //更新系统可用资源
		
		cout<<"系统可用资源:";
		for(int oo=0;oo<n;oo++)
			cout<<a[oo]<<"   ";
		cout<<endl;
	}
	
	if(!IsSafe(m,n))//不安全,恢复各个矩阵
	{
		cout<<"\n\t不安全!\n";
		for(int uu=0;uu<n;uu++)
		{
			a[uu]=a[uu]+r[uu];
			f[k][uu]=f[k][uu]-r[uu];
			s[k][uu]=s[k][uu]+r[uu];	
		}
	}
	else
		cout<<"\n\t安全!\n";
}

void main()
{
	int m,n;
	string PName;  //请求进程名字
	string name[M];  //M个进程名
	
	cout<<"\n\t请输入进程数,资源种类<注意:均小于5>:\n";
	cin>>m>>n;
	
	if(m >= 5 || n >=5)
		cout<<"\n出错!重新输入进程数,资源种类<注意:均小于5>!\n";
	
	else
	{
		for(int i=0; i<m; i++)
		{
			cout<<"\n请输入第"<<i+1<<"个进程的名字:";
			cin>>name[i];
			flag[i] = 0;
		}
		
		for(int i1=0; i1<m; i1++)
		{
			cout<<"\n请输入第"<<i1+1<<"个进程的已分资源:";
			for(int j=0; j<n; j++)
				cin>>f[i1][j];
			
			cout<<"\n请输入第"<<i1+1<<"个进程的尚需资源:";
			for(int j1=0; j1<n; j1++)
				cin>>s[i1][j1];
		}
		
		cout<<"\n输入系统当前可用资源:";
		for(int i2=0; i2<n; i2++)
		{
			cin>>a[i2];
		}
		
		cout<<"\n请输入发出资源请求向量进程的名称:";
		cin>>PName;
		
		cout<<"\n请输入其请求资源情况:";
		for(int j=0;j<n;j++)
			cin>>r[j];
		
		for(int i3=0; i3<m; i3++)
		{
			if(name[i3]==PName)
				k=i3; 
		}
		
		if(k==-1)    //k 是全局变量,初始值为 -1
			cout<<"\n输入进程名有误!";
		else		
			BankManage(m,n);	
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -