📄 c++实现银行家算法.txt
字号:
C++实现银行家算法
#include <string.h>
#include <iostream.h>
#define M 5 //总进程数
#define N 3 //总资源数
#define FALSE 0
#define TRUE 1
int Available[N] = {3,3,2};//系统可用资源向量
int Max[M][N] = {
{7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3},
};//最大需求向量
int Allocation[M][N] = {
{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2},
};//资源分配向量
int Need[M][N] = {
{7,4,3},
{1,2,2},
{6,0,0},
{0,1,1},
{4,3,1},
};//需求向量
int Request[N]={0,0,0};
void ShowData() //显示各数据
{
int i,j;
cout<<"******************************************"<<endl;
cout<<"各进程最大需求矩阵Max为:"<<endl;
for (j=0;j<N;j++)
cout<<" R"<<j;
cout<<endl;
for (i=0;i<M;i++)
{
cout<<"P"<<i<<":";
for (j=0;j<N;j++) cout<<" "<< Max[i][j]<<" ";
cout<<endl;
}
cout<<"******************************************"<<endl;
cout<<endl;
cout<<"******************************************"<<endl;
cout<<"资源分配矩阵Available为:"<<endl;
cout<<" ";
for (j=0;j<N;j++) cout<<" R"<<j<<": ";
cout<<endl;
for(j=0;j<N;j++) cout<<" "<<Available[j]<<" ";
cout<<endl;
cout<<"******************************************"<<endl;
cout<<endl;
cout<<"******************************************"<<endl;
cout<<"各进程还需要的资源量矩阵Need:"<<endl;
for (j=0;j<N;j++)
cout<<" R"<<j;
cout<<endl;
for (i=0;i<M;i++)
{
cout<<"P"<<i<<":";
for (j=0;j<N;j++) cout<<" "<<Need[i][j]<<" ";
cout<<endl;
}
cout<<"******************************************"<<endl;
cout<<endl;
cout<<"******************************************"<<endl;
cout<<" 各进程已经获得的资源量矩阵Allocation: "<<endl;
for (j=0;j<N;j++)
cout<<" R"<<j;
cout<<endl;
for (i=0;i<M;i++)
{
cout<<"P"<<i<<":";
for (j=0;j<N;j++) cout<<" "<<Allocation[i][j]<<" ";
cout<<endl;
}
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 RestorData(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 CheckSafe(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<<"P"<<Temp[i]<<" ";
cout<<endl<<endl;;
return 0;
}
void main()
{
int i=0,j=0;
char flag='y';
void ShowData();
void ChangData(int);
void RestorData(int);
int CheckSafe(int);
ShowData();//显示此算法中的数据
CheckSafe(0);//检查初始时刻的资源分配是否处于安全状态
while(flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<" 请输入需申请资源的进程号(从0到"<<M-1<<",否则重新输入):";
cin>>i;
if(i<0||i>=M)cout<<" 输入的进程号不存在,请重新输入:"<<endl;
}
cout<<" 请输入进程"<<i<<"申请的资源数:"<<endl;
for (j=0;j<N;j++)
{
cin>>Request[j];
if (Request[j]>Max[i][j])
{
cout<<"P"<<i<<"申请的资源数大于最大需求数,此进程非法!"<<endl;
break;
}
else if(Request[j]>Need[i][j])
{
cout<<" P"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的资源量!";
cout<<"申请不合理,请重新选择:"<<endl<<endl;
}
else if(Request[j]>Available[j])
{
cout<<" P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
cout<<"申请不合理,请重新选择:"<<endl<<endl;
}
}
if(flag=='y')
{
ChangData(i);
if(CheckSafe(i))
{
RestorData(i);
ShowData();
}
else
ShowData();
}
else
ShowData();
cout<<endl;
cout<<" 是否继续银行家算法演示,按'y'键继续,按其他任意 键退出演示: ";
cin>>flag;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -