亲测银行家和随机算法在一个主函数里.docx
《亲测银行家和随机算法在一个主函数里.docx》由会员分享,可在线阅读,更多相关《亲测银行家和随机算法在一个主函数里.docx(11页珍藏版)》请在冰豆网上搜索。
![亲测银行家和随机算法在一个主函数里.docx](https://file1.bdocx.com/fileroot1/2023-1/9/fd9e6610-d571-469b-bf48-7fed1c975c2f/fd9e6610-d571-469b-bf48-7fed1c975c2f1.gif)
亲测银行家和随机算法在一个主函数里
#include"string.h"
#include"iostream"
usingnamespacestd;
#defineFALSE0
#defineTRUE1
#defineW10
#defineR20
intM;//总进程数
intN;//资源种类
intALL_RESOURCE[W];//各种资源的数目总和
intMAX[W][R];//M个进程对N类资源最大资源需求量
intAVAILABLE[R];//系统可用资源数
intALLOCATION[W][R];//M个进程已经得到N类资源的资源量
intNEED[W][R];//M个进程还需要N类资源的资源量
intRequest[R];//请求资源个数
voidshowdata()//函数showdata,输出资源分配情况
{
inti,j;
cout<<"各种资源的总数量(all):
"<cout<<"";
for(j=0;j"<cout<cout<<"系统目前各种资源可用的数为(available):
"<cout<<"";
for(j=0;j"<cout<
cout<<"各进程还需要的资源量(need):
"<
cout<<"资源"<<"资源"<<"资源"<for(i=0;ifor(i=0;i{
cout<<"进程p"<
";
for(j=0;jcout<}
cout<cout<<"各进程已经得到的资源量(allocation):
"<cout<<"资源"<<"资源"<<"资源"<for(i=0;i{
cout<<"进程p"<
";
for(j=0;jcout<}
cout<};
voidchangdata(intk)//函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
{
intj;
for(j=0;j{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
};
voidrstordata(intk)//函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值
{
intj;
for(j=0;j{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
};
intchkerr(ints)//函数chkerr,检查是否安全
{
intWORK,FINISH[W],temp[R];
inti,j,k=0;
for(i=0;ifor(j=0;j{
WORK=AVAILABLE[j];
i=s;
while(i{
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;iif(FINISH[i]==FALSE)
{
cout<cout<<"系统不安全!
!
!
本次资源申请不成功!
!
!
"<cout<return1;
}
}
cout<cout<<"经安全性检查,系统安全,本次分配成功。
"<cout<cout<<"本次安全序列:
";
for(i=0;i";
cout<return0;
}
intchkerr2(ints)//函数chkerr2,检查是否安全
{
intWORK,FINISH[W],temp[R];
inti,j,k=0;
for(i=0;ifor(j=0;j{
WORK=AVAILABLE[j];
i=s;
while(i{
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;iif(FINISH[i]==FALSE)
{
cout<cout<<"本次资源申请成功!
!
!
但系统不安全!
!
!
"<cout<return1;
}
}
cout<cout<<"经安全性检查,系统安全,本次分配成功。
"<cout<cout<<"本次安全序列:
";
for(i=0;i";
cout<return0;
}
voidbank()//银行家算法
{
inti=0,j=0;
charflag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<"请输入需申请资源的进程号(从P0到P"<):
";
cout<<"p";cin>>i;
if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!
"<}
cout<<"请输入进程P"<
"<for(j=0;j{
cout<<"资源"<";
cin>>Request[j];
if(Request[j]>NEED[i][j])
{
cout<<"进程P"<
";
cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
cout<<"进程P"<
";
cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
cout<cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:
";
cin>>flag;
}
}
voidrandomallocation()//随机分配算法
{
inti=0,j=0;
charflag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<"请输入需申请资源的进程号(从P0到P"<):
";
cout<<"p";cin>>i;
if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!
"<}
cout<<"请输入进程P"<
"<for(j=0;j{
cout<<"资源"<";
cin>>Request[j];
if(Request[j]>AVAILABLE[j])
{
cout<<"进程P"<
";
cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);
showdata();
chkerr2(i);
}
cout<<"是否继续随机分配算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:
";
cin>>flag;
}
}
voidmain()//主函数
{
cout<<"※※※※※※※※※※※※※※※※※※※※"<cout<<"※欢迎使用本系统!
※"<cout<<"※※"<cout<<"※====================================※"<inti=0,j=0,p;
cout<<"输入总进程数:
"<cin>>M;
cout<<"输入总资源种类:
"<cin>>N;
cout<<"请输入各类总资源数(all_resource):
"<for(i=0;icin>>ALL_RESOURCE[i];
cout<<"依次输入各进程所需要的最大资源数量(max):
"<for(i=0;i{
for(j=0;j{
do
{
cin>>MAX[i][j];
if(MAX[i][j]>ALL_RESOURCE[j])
cout<}while(MAX[i][j]>ALL_RESOURCE[j]);
}
}
cout<<"依次输入各进程已经占据的资源数量(allocation):
"<for(i=0;i{
for(j=0;j{
do
{
cin>>ALLOCATION[i][j];
if(ALLOCATION[i][j]>MAX[i][j])
cout<}while(ALLOCATION[i][j]>MAX[i][j]);
}
}
//初始化资源数量
for(i=0;i{p=ALL_RESOURCE[i];
for(j=0;j{
p-=ALLOCATION[j][i];//减去已经被占据的资源
AVAILABLE[i]=p;
if(AVAILABLE[i]<0)
AVAILABLE[i]=0;
}
}
for(i=0;ifor(j=0;jNEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
showdata();
do{
cout<cout<";
cin>>i;
if(i==2)//m=2表赋值,m==2表判断
bank();
else
randomallocation();
}while(!
((i==1)||(i==2)));
}