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

📄 银行家算法.cpp

📁 操作系统银行家算法原代码
💻 CPP
字号:
#include <string.h>
#include <iostream.h>
#define M 5           //总进程数
#define N 3           //总资源数
#define FALSE 0
#define TRUE 1
//---------------------------------defination--------------------



int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//M个进程对N类资源最大资源需求量
int AVAILABLE[N]={10,5,7}; //系统可用资源数
int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//M个进程已经得到N类资源的资源量
int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//M个进程还需要N类资源的资源量 
int Request[N]={0,0,0};//进程所需要的资源



//------------------------------main-----------------------------



void main()
{
	
	int i=0,j=0,no=0;
	char flag='Y';
	void showdata();
	void changdata(int);
	void rstordata(int);
	int chkerr(int);
	showdata();
     
	while(flag=='Y'||flag=='y')
	{
		i=0;
		for(i;i<=M;i++)//输入需要申请资源的进程号
		{
			cout<<"  需申请资源的进程号(从0到"<<M-1<<",否则重输入!):"<<i<<":";//提示信息
			cout<<"  请输入进程"<<i<<"申请的资源数"<<endl;//提示信息

			for (j=0;j<N;j++)//输入请求资源的进程所需要的资源情况
			{
				cout<<"  资源"<<j<<":  ";
				cin>>Request[j];
				if(Request[j]>NEED[i][j])
				{
					cout<<"  进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的资源量!";
					cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
					flag='N';
				}//if
				else
				{
					if(Request[j]>AVAILABLE[j])
					{
						cout<<"  进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
						cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
						flag='N';
					}//if
					if(flag=='Y'||flag=='y')
					{
						changdata(i);
						if(!chkerr(i))
						{
							rstordata(i);
							showdata();
						}//in-if
					}//out-if
					else
						showdata();
					cout<<endl;
				}//else
			}//in-for
		}//out-for
		cout<<"  是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
		cin>>flag;//whether to exit
	}	//while	
}//void
//--------------------------------输出数据------------------------------------------




void showdata()//一个显示初始情况的函数
{
	int i,j;
    cout<<"        系统可用的资源数为:"<<endl<<endl;
	cout<<"      ";
	for (j=0;j<N;j++)cout<<"  资源"<<j<<":  "<<AVAILABLE[j];
    cout<<endl;
    
	cout<<endl;
	cout<<"        各进程还需要的资源量:"<<endl<<endl;
	for (i=0;i<M;i++)
	{
		cout<<"进程"<<i<<":";
		for (j=0;j<N;j++)cout<<"  资源"<<j<<":  "<<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<<"  资源"<<j<<":  "<<ALLOCATION[i][j];
        cout<<endl;
	}
    
	cout<<endl;
}




//-----------------------------------刷新数据----------------------------------------------------




void changdata(int k)
{
	int j;
	for (j=0;j<N;j++)
	{
		AVAILABLE[j]=AVAILABLE[j]-Request[j];		
		ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
		NEED[k][j]=NEED[k][j]-Request[j];
	}
}




//------------------------------------储存数据-----------------------------------------------------




void rstordata(int k)
{
		int j;
		for (j=0;j<N;j++)
		{
			AVAILABLE[j]=AVAILABLE[j]+Request[j];
			ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
			NEED[k][j]=NEED[k][j]+Request[j];
		}
}




//----------------------------------检查错误---------------------------------------------------------




int chkerr(int s)
{
		int WORK,FINISH[M],temp[M];
		int i,j,k=0;
		for(i=0;i<M;i++)FINISH[i]=FALSE;

		for(j=0;j<N;j++)
		{
			WORK=AVAILABLE[j];
			i=s;
			while(i<M)
			{
				if (FINISH[i]==FALSE&&NEED[i][j]<=WORK)
				{
					
					WORK=WORK+ALLOCATION[i][j];
					FINISH[i]=TRUE;					
					temp[k]=i;
					k++;
					i=0;
				}
				else
				{
					i++;
				}
			}
			for(i=0;i<M;i++)
				if(FINISH[i]==FALSE)
				{
					cout<<endl;
					cout<<"  系统不安全!!! 本次资源申请不成功!!!"<<endl;
					
					cout<<endl;
					return 1;
				}


				
		
		}
		cout<<endl;
		
		cout<<"  经安全性检查,系统安全,本次分配成功。"<<endl;
		cout<<endl;
		cout<<"  本次安全序列:";
		for(i=0;i<M;i++)cout<<"进程"<<temp[i]<<"->";
		cout<<endl<<endl;;
		return 0;
	}






⌨️ 快捷键说明

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