zuizhong.txt
来自「详细的银行家算法」· 文本 代码 · 共 258 行
TXT
258 行
#include <iostream>
using namespace std;
int AVAILABLE[5]; /*可用资源数组*/
int MAX[10][5]; /*最大需求矩阵*/
int ALLOCATION[10][5]; /*分配矩阵*/
int NEED[10][5]; /*进程需求矩阵*/
int need1[10][5] ; //手工输入需求矩阵
int REQUEST[10][5]; /*进程需要资源数*/
int total[5];
int totalAllocation[5];
bool FINISH[10]; /*系统是否有足够的资源分配*/
int p[10]; /*记录序列*/
int m,n; /*m个进程,n个资源*/
void Init();
bool IsSafe();
void Bank();
void Init() /*初始化算法*/
{
int i,j;
cout<<"请输入进程的数目:";
cin>>m;
cout<<"请输入资源的种类:";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入"<<endl;
for(i=0;i<m;i++)
{ cout<<"p"<<i<<" ";
for(j=0;j<n;j++)
cin>>MAX[i][j];}
cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl;
for(i=0;i<m;i++)
{ cout<<"p"<<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;
}
}
}
loop: cout<<"请输入need1矩阵"<<endl;
for(i=0;i<m;i++){
for(j=0;j<n;j++)
{
cin>>need1[i][j];
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++)
{
if(need1[i][j]>NEED[i][j])
{ cout<<"输入有错,请重新输入:"<<endl;
goto loop ;
}
// continue;
}
}
cout<<"请输入各个资源共有的数目:"<<endl;
for(j=0;j<n;j++)
{
cin>>total[j];
}
for(j=0;j<n;j++){
for(i=0;i<m;i++)
{totalAllocation[j]+=ALLOCATION[i][j];}
AVAILABLE[j]=total[j]-totalAllocation[j];
}
cout<<"系统可利用资源";
for(j=0;j<n;j++)
{
cout<<" "<<AVAILABLE[j];
}
cout<<endl;
}
void Bank() /*银行家算法*/
{
int i,num,q;
char again;
while(1)
{
loop1: cout<<"请输入要申请资源的进程号(从0开始)"<<endl;
cin>>num;
cout<<"请输入进程所请求的各资源的数量"<<endl;
for(i=0;i<n;i++)
{
cin>>REQUEST[num][i];
}
for(i=0;i<n;i++)
{
if(REQUEST[num][i]>NEED[num][i])
{
cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl;
goto loop1;
}
if(REQUEST[num][i]>AVAILABLE[i])
{
cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<<endl;
goto loop1;
}
else
cout<<"Request"<<num<<"(";
for(i=0;i<n;i++)
cout<<REQUEST[num][i]<<",";
cout<<")<=Need"<<num<<"(";
for(i=0;i<n;i++)
cout<<NEED[num][i]<<",";
cout<<")"<<endl;
cout<<"Request"<<num<<"(";
for(i=0;i<n;i++)
cout<<REQUEST[num][i]<<",";
cout<<")<=AVAILABLE"<<"(";
for(i=0;i<n;i++)
cout<<AVAILABLE[i]<<",";
cout<<")";
}
for(i=0;i<n;i++)
{
AVAILABLE[i]-=REQUEST[num][i];
ALLOCATION[num][i]+=REQUEST[num][i];
NEED[num][i]-=REQUEST[num][i];
}
if(IsSafe())
{
cout<<"同意分配请求!"<<endl;
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
cout<<"当前可利用资源";
for(i=0;i<n;i++)
cout<<AVAILABLE[i]<<" ";
cout<<endl;
cout<<"当前各进程需要资源:"<<endl;
for(i=0;i<m;i++)
{ for(q=0;q<n;q++)
{cout<<NEED[i][q];}
cout<<endl;
}
cout<<"您还想再次请求分配吗?是请按y/n,否请按其它键"<<endl;
cin>>again;
if(again=='y'||again=='Y')
{
continue; //跳到while继续执行银行家算法
}
break;
}
else
{
cout<<"您的请求被拒绝!"<<endl;
for(i=0;i<n;i++)
{
AVAILABLE[i]+=REQUEST[num][i];
ALLOCATION[num][i]-=REQUEST[num][i];
NEED[num][i]+=REQUEST[num][i];
}
}
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
}
}
bool IsSafe() //安全性检查算法
{
int i,j,k,l=0;
int Work[5]; /*可利用资源数*/
for(i=0;i<n;i++)
Work[i]=AVAILABLE[i];
for(i=0;i<m;i++) //先初始化均为false
{
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]; //可利用资源相加
}
p[l++]=i;
i=-1; //重新从进程0开始循环,已加入的则跳过
}
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;
}
int main()
{
Init();
IsSafe();
Bank();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?