📄 银行家.txt
字号:
#include <iostream.h>
#define MAXPROCESS 50 //最大进程数
#define MAXRESOURCE 100 //最大资源种数
int AVAILABLE[MAXRESOURCE]; //可用资源数组
int MAX[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵
int ALLOCATION[MAXPROCESS][MAXRESOURCE]; //已分配矩阵
int NEED[MAXPROCESS][MAXRESOURCE]; //现在还需要申请分配的资源数矩阵
int REQUEST[MAXPROCESS][MAXRESOURCE]; //进程需要申请资源数
bool FINISH[MAXPROCESS]; //记录系统是否有足够的资源分配,系统自动初始化其为false
int temp[MAXPROCESS];//记录进程序列
int m,n; //m个进程,n种资源
void show();
void Initial();
bool Safe();
void requese();
void main()
{int choice;
int flag=1;
Initial();
while(flag)
{cout<<"***************************请选择操作******************************"<<endl;
cout<<" 1.查看资源分配情况 2.为作业申请资源 0.退出系统"<<endl;
cout<<"请输入您的选择:" ;
cin>>choice;
switch(choice)
{case 1:
show();
break;
case 2:
requese();
break;
case 0:
flag=0;
break;
default:
cout<<"输入错误";
}
}
}
void Initial() //初始化算法
{
int i,j;
cout<<"请输入进程的数目:";
cin>>m;
cout<<"请输入资源的种类:";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"<<n<<"x"<<m<<"矩阵输入"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>MAX[i][j];
cout<<"请输入每个进程已分配的各资源数,也按照"<<n<<"x"<<m<<"矩阵输入"<<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 requese()// 请求资源算法
{
int i,number;
cout<<"请输入需申请资源的进程号(从0到"<<m-1<<",否则重输入!):";
while(1)
{
cin>>number;
if(number>=m){cout<<"您输入的进程号错误,请重新输入。"<<endl;continue;}
else break;
}
cout<<"请输入进程所请求的各资源的数量:"<<endl;
for(i=0;i<n;i++)
{ cout<<"资源"<<i<<":";
cin>>REQUEST[number][i];
if(REQUEST[number][i]>NEED[number][i])
{
cout<<"您输入的请求数超过进程的需求量!请求错误"<<endl;
goto A;
}
if(REQUEST[number][i]>AVAILABLE[i])
{
cout<<"您输入的请求数超过系统有的资源数!请求错误!"<<endl;
goto A;
}
}
for(i=0;i<n;i++)
{
AVAILABLE[i]=AVAILABLE[i]-REQUEST[number][i];
ALLOCATION[number][i]+=REQUEST[number][i];
NEED[number][i]-=REQUEST[number][i];
}
if(Safe()) //调用安全算法safe(),检验能否分配
{ cout<<"同意分配请求!"<<endl; }
else
{ cout<<"您的请求被拒绝!"<<endl;
for(i=0;i<n;i++) //进程申请资源失败后归还资源
{
AVAILABLE[i]=AVAILABLE[i]+REQUEST[number][i];
ALLOCATION[number][i]-=REQUEST[number][i];
NEED[number][i]+=REQUEST[number][i];
}
}
for(i=0;i<m;i++)// FINISH变量返回到初始化状态
{ FINISH[i]=false; }
A: ;}
bool Safe() //检查安全性算法
{
int i,j,k,l=0;
int Work[MAXRESOURCE]; //工作数组
for(i=0;i<n;i++)
Work[i]=AVAILABLE[i];
for(i=0;i<m;i++)
FINISH[i]=false;
for(i=0;i<m;i++)
{
if(FINISH[i]==true) continue;
else
{
for(j=0;j<n;j++)
{
if(NEED[i][j]>Work[j])
break;
}
if(j==n)
{ FINISH[i]=true;
for(k=0;k<n;k++)
{
Work[k]+=ALLOCATION[i][k];
}
temp[l++]=i;
i=-1;
}
else continue;
}
if(l==m)
{
cout<<"系统是安全的"<<endl;
cout<<"安全序列:"<<endl;
for(i=0;i<l;i++)
{
cout<<temp[i];
if(i!=l-1)
cout<<"-->";
}
cout<<endl;
return true;
}
}
cout<<"系统是不安全的"<<endl;
return false;
}
void show()
{
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -