银行家算法程序代码
#include<string.h>
#include<stdio.h>
#include<iostream.h>
#defineFALSE0
#defineTRUE1
#defineW10
#defineR10
int适短怀连队沙永能电M;//总进程数
intN;//资源种类
intALL样吃哪加_RESOURCE[W];//各种资源的数目总和
intMAX[W][R];//M个进晚术植距独普七应转的程对N类资源最大资源需求量
intAVAILABLE[R];//系统可用资源数
intALLOCATION360问答[W][R];//M个进程已经得到N类资源的资源量
intNEED[W][R];//M个进程还需要N类资字较音操不千往菜源的资源量
intRequest[R];//请求资源个数
voidoutput()
{
inti,j;
cout<<endl<<"━菜胜度绝绝范五劳走银纪━━━━━━━━━━━━━━━━━"<<en所久参某诗协据台dl;
cout<<"各种资源的总数量:"<<endl及内银刘汽南剂设景搞;
for(j=0;j<N;j++)
cout<<"资源"<<j<<":"<<ALL_RESOURCE[j];
cout<<endl;
cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"目异抓材体前各种资源可利用的数扩神维低敌投府征量为:"<<endl;
规资for(j=0;j<N;j++)
cout<<"资源"<<j<<":"<<AVAILABLE[j];
cout<<endl;
cout<<"━━━━━━━━━━━━━━━━━━"<<e看数众ndl;
cout<<"各进程还需要的资源数量:"<<endl<<endl;
for(i=0;i<N;i++)
cout<<"资源"<<i;
cout<<endl;
for(i=0;i<M;i++)
{
cout<<"进程"<<i<<":";
for(j=0;j<N;j++)
cout<<NEED[i][j]<<"";
cout<<endl;
}
cout<<endl;
cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
cou胶号跑员龙轻九眼课t<<"各进程已经得到的资跟源量:"<<endl<<endl;
for(i=0;i<N;i++)
cout<<"资源"<<i;
cout<<endl;
for(i=0;外i<M;i++)
{
cout<<"进劳海鲜顾技程"<<i<<":";
for(j=0;j<N;j++)
cout<<ALLOCATION[i][j]<<"";
cout<<endl;
}
cout<<endl;
}
vo乙普效命乡iddistribute(intk)
{
intj;
for(j=0;j<N;j++)
{
AVAILABLE[j]=AVAIL演决端杀鲜师座随应行度ABLE[j]-Req只联uest[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
}
voidrestore(intk)
{
intj;
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];
}
}
intcheck()
{
intWORK[R],FINISH[W];
inti,j;
for(j=0;j<N;j++)WORK[j]=AVAILABLE[j];
for(i=0;i<M;i++)FINISH[i]=FALSE;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(FINISH[i]==FALSE&&NEED[i][j]<=WORK[j])
{
WORK[j]=WORK[i]+ALLOCATION[i][j];
}
}
FINISH[i]=TRUE;
}
for(i=0;i<M;i++)
{
if(FINISH[i]==FALSE)
{
cout<<endl;
cout<<"系统不安全!!!本次资源申请不成功!!!"<<endl;
cout<<endl;
return1;
}
else
{
cout<<endl;
cout<<"经安全性检查,系统安全,本次分配成功。"<<endl;
cout<<endl;
return0;
}
}
}
voidbank()//银行家算法
{
inti=0,j=0;
charflag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
cout<<endl<<"请输入需申请资源的进程号:";
cin>>i;
if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!"<<endl;
}
cout<<"请输入进程"<<i<<"申请各类资源的数量:"<<endl;
for(j=0;j<N;j++)
{
cout<<"资源"<<j<<":";
cin>>Request[j];
if(Request[j]>NEED[i][j])//若请求的资源数大于进程还需要i类资源的资源量j
{
cout<<endl<<"进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的数量!";
cout<<"若继续执行系统将处于不安全状态!"<<endl;
flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数
{
cout<<endl<<"进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的数量!";
cout<<"若继续执行系统将处于不安全状态!"<<endl;
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
distribute(i);//调用change(i)函数,改变资源数
if(check())//若系统安全
{
restore(i);//调用restore(i)函数,恢复资源数
output();//输出资源分配情况
}
else//若系统不安全
output();//输出资源分配情况
}
else//若flag=N||flag=n
cout<<endl;
cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:";
cin>>flag;
}
}
voidversion()
{
cout<<endl;
cout<<"\t 银行家算法 "<<endl;
}
voidmain()//主函数
{
inti=0,j=0,p;
version();
getchar();
cout<<endl<<"请输入总进程数:";
cin>>M;
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"请输入总资源种类:";
cin>>N;
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"请输入各类资源总数:(需要输入数为"<<N<<"个)";
for(i=0;i<N;i++)
cin>>ALL_RESOURCE[i];
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"输入各进程所需要的各类资源的最大数量:(需要输入数为"<<M*N<<"个)";
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
do
{
cin>>MAX[i][j];
if(MAX[i][j]>ALL_RESOURCE[j])
cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
}
while(MAX[i][j]>ALL_RESOURCE[j]);
}
}
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"输入各进程已经占据的各类资源的数量:(需要输入数为"<<M
*N<<"个)";
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
do
{
cin>>ALLOCATION[i][j];
if(ALLOCATION[i][j]>MAX[i][j])
cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
}
while(ALLOCATION[i][j]>MAX[i][j]);
}
}
for(j=0;j<N;j++)//初始化资源数量
{
p=ALL_RESOURCE[j];
for(i=0;i<M;i++)
{
p=p-ALLOCATION[i][j];//减去已经被占据的资源
AVAILABLE[j]=p;
if(AVAILABLE[j]<0)
AVAILABLE[j]=0;
}
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
output();
bank();
}
实验结果分析
1.根据下面给出的系统中资源分配情况,以及各个进程的资源申请情况,通过银行家算法来判断各进程的资源请求能否满足(要求记录程序的运行过程)。
已分配的资源 最大需求量
A B C A B C
P1 0 1 0 7 5 3
P2 2 0 0 3 2 2
P3 3 0 2 9 0 2
P4 2 1 1 2 2 2
P5 0 0 2 4 3 3
剩余资源 A B C
3 3 2
标签:算法,银行家,代码