模拟实现银行家算法,用银行家算法实现资源分配和安全性检查。
通过本次实验,加深对死锁概念的理解和掌握。
#include <iostream>
using namespace std;
void progressarrangement(int progressnumber,int resourcenumber,int Need[10][10],int Available[10],int Allocation[10][10],int state[10])
{
int pnumber=0;
for(int j=0;j<progressnumber;j++)
{
for(int g=0;g<progressnumber;g++)
{
int k=0;
for(int i=0;i<resourcenumber;i++)
{
if(Need[g][i]<=Available[i])
k++;
}
if(k==resourcenumber&&state[g]==0)
{
cout<<"正在被执行的进程是P"<<g<<endl;
for(int i=0;i<resourcenumber;i++)
Available[i]=Available[i]+Allocation[g][i];
state[g]=1;;
pnumber++;
}
}
}
if(pnumber<progressnumber)
cout<<"找不到安全序列"<<endl;
for(int i=0;i<progressnumber;i++)
state[i]=0;
for(int j=0;j<progressnumber;j++)
for(int i=0;i<resourcenumber;i++)
Available[i]=Available[i]-Allocation[j][i];
}
void dealrequstion(int progressnumber,int resourcenumber,int Need[10][10],int Available[10],int Allocation[10][10],int requstion[10][10],int state[10])
{
int n;
cout<<"请输入申请资源的进程号Pn"<<endl;
cin>>n;
cout<<"请输入申请的各类资源个数"<<endl;
for(int i=0;i<resourcenumber;i++)
cin>>requstion[n][i];
int number=0;
for(int i=0;i<resourcenumber;i++)
if(requstion[n][i]>Available[i]||requstion[n][i]>Need[n][i])
cout<<"申请的资源不能得到分配"<<endl;
else {
Allocation[n][i]=Allocation[n][i]+requstion[n][i];
Need[n][i]-=requstion[n][i];
Available[i]=Available[i]-requstion[n][i];
number++;
}
if(number==resourcenumber)
progressarrangement(progressnumber,resourcenumber,Need,Available,Allocation,state);
}
void inputdata(int &progressnumber,int &resourcenumber,int Need[10][10],int Available[10],int Allocation[10][10],int requstion[10][10])
{
cout<<"请输入系统总的资源种类数:"<<endl;
cin>>resourcenumber;
cout<<"请输入系统总的进程数:"<<endl;
cin>>progressnumber;
cout<<"请输入每类资源的个数"<<endl;
for(int i=0;i<resourcenumber;i++)
cin>>Available[i];
for(int j=0;j<progressnumber;j++)
{
cout<<"请输入进程P"<<j<<"已占有的各类资源数"<<endl;
for(int i=0;i<resourcenumber;i++)
cin>>Allocation[j][i];
}
for(int j=0;j<progressnumber;j++)
{
cout<<"请输入进程P"<<j<<"还需要的各类资源数"<<endl;
for(int i=0;i<resourcenumber;i++)
cin>>Need[j][i];
}
for(int j=0;j<progressnumber;j++)
for(int i=0;i<resourcenumber;i++)
Available[i]=Available[i]-Allocation[j][i];
cout<<" MAX Allocation Need "<<endl;
for(int j=0;j<progressnumber;j++)
{
for(int i=0;i<resourcenumber;i++)
cout<<Allocation[j][i]+Need[j][i]<<" ";
cout<<" ";
for(int i=0;i<resourcenumber;i++)
cout<<Allocation[j][i]<<" ";
cout<<" ";
for(int i=0;i<resourcenumber;i++)
cout<<Need[j][i]<<" ";
cout<<endl;
}
cout<<"可获得的资源数为"<<endl;
for(int i=0;i<resourcenumber;i++)
cout<<Available[i]<<" ";
cout<<endl;
}
void mainmenu(int progressnumber,int resourcenumber,int Need[10][10],int Available[10],int Allocation[10][10],int requstion[10][10],int state[10])
{
int number;
int h=0;
while(h!=1)
{
cout<<"欢迎****银行家算法模拟程序"<<endl;
cout<<"1.请录入相关数据"<<endl;
cout<<"2.根据银行家算法,写出安全序列"<<endl;
cout<<"3.申请资源"<<endl;
cout<<"4.结束程序"<<endl;
cout<<"输入你的选择:"<<endl;
cin>>number;
switch(number)
{
case 1: inputdata(progressnumber,resourcenumber,Need,Available,Allocation,requstion);
break;
case 2: progressarrangement(progressnumber,resourcenumber,Need,Available,Allocation,state);
break;
case 3: dealrequstion(progressnumber,resourcenumber,Need,Available,Allocation,requstion,state);
break;
case 4:h=1;
}
}
}
int resourcenumber,progressnumber;
int main()
{
int Allocation[10][10],Need[10][10];
int Available[10],requstion[10][10];
int state[10]={0};
//int Allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
//int Need[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
mainmenu(progressnumber,resourcenumber,Need,Available,Allocation,requstion,state);
return 0;
}