操作系统实验:银行家算法模拟
要求:编写一个系统动态分配资源的模拟程序,采用银行家算法有效地避免死锁的发生。要求程序能够在进程提出资源申请后判断系统是否处于安全状态,如果安全则打印资源分配表和安全序列;如果不安全则输出不能分配的提示。
代码如下:
#include
#include<stdio.h>
using namespace std;
// 五个进程,四个资源的银行家算法
int Available[4];
int Need[5][4] = {0} ; //进程需要资源数组
int Claim[5][4]; //最大需求数组
int Allocation[5][4]; //当前分配资源数
int Request[4] = {0}; //请求资源数
int finish[5]; //进程是否处于安全状态
int fr[4];
void check() //检测系统T0时刻是否处于安全状态
{
int i,j,x;
int k=0,num=0;
int a;
cout<<"T0时刻的安全序列为:"<<endl;
for(i=0;i<4;i++) //将可用资源赋值给fr变量
{
fr[i]=Available[i];
}
while(num!=5)
{
for(x=0;x<5;x++)
{
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
if(finish[i]==1) //该进程已经检查匹配过
{
break;
}
else
{
if(Need[i][j]<=fr[j])
{
k++;
}
if(j==3&&k!=4) //循环到第四个资源,没有能满足条件的,将标记去掉。
{
k=0;
}
if(j==3&&k==4)
{
a=i; //找出满足条件的 ,标记出来
num=num+1; //找出第一个,直到完成所有匹配为止
for(i=0;i<4;i++)
{
fr[i]=fr[i]+Allocation[a][i];
finish[a]=1;
k=0;
}
cout<<"P"<<a<<",";
}
}
}
}
}
if(num!=5) //执行完所有进程安全匹配以后,进程均无法满足序列要求的话
{
cout<<"错误!!!"<<endl;
cout<<"系统资源进程分配在T0时刻不存在一个安全序列,该系统无法执行银行家算法"<<endl;
num=5; //退出循环
}
}
}
void show() //资源分配表
{
cout<<endl;
cout<<"---------------------------------------------------------------------------------------------"<<endl;
cout<<" Allocation Claim Need Available “<<endl;
cout<<”---------------------------------------------------------------------------------------------"<<endl;
cout<<"进程 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 "<<endl;
int i,j;
for(i=0;i<5;i++)
{
cout<<" P"<<i<<" ";
for(j=0;j<4;j++)
{
cout<<Allocation[i][j]<<" ";
}
cout<<" ";
for(j=0;j<4;j++)
{
cout<<Claim[i][j]<<" ";
}
cout<<" ";
for(j=0;j<4;j++)
{
cout<<Need[i][j]<<" ";
}
cout<<" ";
if(i==0)
{
for(j=0;j<4;j++)
{
cout<<Available[j]<<" ";
}
}
cout<<endl;
}
cout<<"--------------------------------------------------------------------------------------------"<<endl;
}
void request()
{
int i,j,k;
int N,A,B,D,e;
int C=0;
while(C==0)
{
N=0,A=0;
cout<<"输入申请的进程名(用0-4表示P0-P4)"<<endl;
cin>>k;
cout<<"输入P"<<k<<"进程的申请资源数"<<endl;
for(i=0;i<4;i++)
{
cin>>Request[i];
}
for(i=0;i<4;i++)
{
if(Need[k][i]<Request[i]) //请求超出剩余完成数目
{
N=1;
}
if(Request[i]>Available[i]) //请求超出系统目前可分配资源数
{
A=1;
}
if(N==1)
{
cout<<"请求超出进程剩余完成数目,已退出"<<endl;
break;
}
if(A==1)
{
cout<<"请求超出系统目前可分配资源数,已退出"<<endl;
break;
}
}
while(N!=1&&A!=1) //请求暂时没问题的话,执行
{
for(i=0;i<4;i++)
{
Available[i]=Available[i] - Request[i]; //执行请求后剩余可分配数目
Need[k][i] = Need[k][i] - Request[i]; //执行请求后剩余的完成数目
}
for(i=0;i<4;i++)
{
int F=0;
if(Available[i]<Need[k][i]) //可用资源少于执行进程所需剩余资源数
{
B=1;
}
else if(Available[F]==0&&Available[F+1]==0&&Available[F+2]==0&&Available[F+3]==0) //可用资源用完了
{
B=1;
}
}
if(B==1)
{
show();
cout<<"由上表可见,可用资源已经不能满足任何进程的申请,执行该申请会使系统进入不安全状态,不能分配资源"<<endl;
for(i=0;i<4;i++)
{
Available[i]=Available[i] + Request[i]; //将变化的数值还回去
Need[k][i] = Need[k][i] + Request[i]; //将变化的数值还回去
}
cout<<endl;
cout<<endl;
cout<<"资源分配表如下:"<<endl;
show();
B=0;
break;
}
else //资源申请成功
{
for(i=0;i<4;i++)
{
if(Need[k][i]==0)
{
e++;
}
if(i==3&&e!=4) //进程还没分配完
{
e=0;
for(i=0;i<4;i++)
{
Allocation[k][i]= Allocation[k][i]+ Request[i];
}
cout<<"资源申请成功,资源分配表如下:"<<endl;
show();
}
if(i==3&&e==4) //进程分配完
{
for(i=0;i<4;i++)
{
Available[i]=Available[i]+Allocation[k][i]+Request[i];
}
for(i=0;i<4;i++)
{
Allocation[k][i]=0;
}
e=0;
cout<<"该进程已完成,该进程分配的资源已释放"<<endl;
cout<<"资源申请成功,资源分配表如下:"<<endl;
show();
}
}
cout<<"是否继续? 退出测试输入0,继续测试输入非零字符"<<endl;
cin>>D;
if(D==0)
{
N=1,C=1;
}
else{
break;
}
}
}
}
}
int main()
{
int i,j;
cout<<"银行家算法模拟"<<endl;
cout<<"输入书本102-103资源分配案例数据(5个进程,4类资源)"<<endl;
cout<<"依次输入五个进程的最大资源需求数" <<endl;
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
cin>>Claim[i][j];
}
}
cout<<"输入每个进程每个资源的已分配资源的数目"<<endl;
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
cin>>Allocation[i][j];
Need[i][j] = Claim[i][j] - Allocation[i][j];
}
}
cout<<"输入每个资源剩余可用数量"<<endl;
for(i=0;i<4;i++)
{
cin>>Available[i];
}
check();
cout<<endl;
cout<<endl;
cout<<"当前时刻资源分配表如下";
show();
request();
return 0;
}
效果截图:
总结:这个实验还是挺有趣。