#include <iostream> #include <string.h> #define M 3 //资源的种类数 #define N 5 //进程的个数 using namespace std; void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); //统一的输出格式 bool safety(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); bool banker(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); int main() { int i,j; //当前可用每类资源的资源数 int iAvailable[M]={3,3,2}; //系统中N个进程中的每一个进程对M类资源的最大需求 int iMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //iNeed[N][M]每一个进程尚需的各类资源数 //iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数 int iNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //进程名 char cName[N]={'a','b','c','d','e'}; bool bExitFlag=true; //退出标记 char ch; //接收选择是否继续提出申请时传进来的值 bool bSafe; //存放安全与否的标志 //计算iNeed[N][M]的值 for(i=0;i<N;i++) for(j=0;j<M;j++) iNeed[i][j]=iMax[i][j]-iAllocation[i][j]; //输出初始值 output(iMax,iAllocation,iNeed,iAvailable,cName); //判断当前状态是否安全 bSafe=safety(iAllocation,iNeed,iAvailable,cName); //是否继续提出申请 while(bExitFlag) { cout<<"\n"<<"继续提出申请?\ny为是;n为否。\n"; cin>>ch; switch(ch) { case 'y': //cout<<"调用银行家算法"; bSafe=banker(iAllocation,iNeed,iAvailable,cName); if (bSafe) //安全,则输出变化后的数据 output(iMax,iAllocation,iNeed,iAvailable,cName); break; case 'n': cout<<"退出。\n"; bExitFlag=false; break; default: cout<<"输入有误,请重新输入:\n"; } } return 0; } //输出 void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]) { int i,j; cout<<"\n\t Max \tAllocation\t Need \t Available"<<endl; cout<<"\tA B C\tA B C\tA B C\t A B C"<<endl; for(i=0;i<N;i++) { cout<<cName[i]<<"\t"; for(j=0;j<M;j++) cout<<iMax[i][j]<<" "; cout<<"\t"; for(j=0;j<M;j++) cout<<iAllocation[i][j]<<" "; cout<<"\t"; for(j=0;j<M;j++) cout<<iNeed[i][j]<<" "; cout<<"\t"; cout<<" "; //Available只需要输出一次 if (i==0) for(j=0;j<M;j++) cout<<iAvailable[j]<<" "; cout<<endl; } } 这个银行家算法还未完成,请你帮忙实现safety()和banker()这两个函数
时间: 2024-03-30 21:40:40 浏览: 89
实现safety()函数:
bool safety(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]) {
int i,j,k,l=0;
int iWork[M]; //当前可用每类资源的资源数
bool bFinish[N]={false}; //记录进程是否完成
bool bSafe=true; //安全标志
//初始化iWork数组
for(i=0;i<M;i++)
iWork[i]=iAvailable[i];
//循环遍历所有进程
for(i=0;i<N;i++) {
if (!bFinish[i]) {
//判断该进程是否满足资源需求
for(j=0;j<M;j++) {
if (iNeed[i][j] > iWork[j])
break;
}
//如果满足,更新iWork数组和bFinish数组
if (j==M) {
for(k=0;k<M;k++)
iWork[k]+=iAllocation[i][k];
bFinish[i]=true;
cName[l++]=cName[i]; //记录安全序列
}
}
}
//判断是否存在安全序列
for(i=0;i<N;i++) {
if (!bFinish[i]) {
bSafe=false;
break;
}
}
//输出安全序列
if (bSafe) {
cout<<"\n存在安全序列,安全序列为:";
for(i=0;i<N;i++)
cout<<cName[i]<<" ";
} else
cout<<"\n不存在安全序列!";
return bSafe;
}
实现banker()函数:
bool banker(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]) {
int i,j;
int iRequest[M]; //进程请求的资源数
int iWork[M]; //当前可用每类资源的资源数
bool bFinish[N]={false}; //记录进程是否完成
bool bSafe=true; //安全标志
//初始化iWork数组
for(i=0;i<M;i++)
iWork[i]=iAvailable[i];
//输入进程请求的资源数
cout<<"\n请输入请求资源的进程编号(0~4):";
cin>>i;
cout<<"请输入请求的资源数(3个数字):";
for(j=0;j<M;j++)
cin>>iRequest[j];
//判断该进程请求资源是否超过其需求
for(j=0;j<M;j++) {
if (iRequest[j] > iNeed[i][j]) {
cout<<"\n进程所请求的资源数超过其需求!";
return false;
}
}
//判断该进程请求资源是否超过当前可用资源
for(j=0;j<M;j++) {
if (iRequest[j] > iWork[j]) {
cout<<"\n当前没有足够的资源可分配!";
return false;
}
}
//模拟分配资源
for(j=0;j<M;j++) {
iWork[j]-=iRequest[j];
iAllocation[i][j]+=iRequest[j];
iNeed[i][j]-=iRequest[j];
}
//判断当前状态是否安全
bSafe=safety(iAllocation,iNeed,iWork,cName);
//如果不安全,回滚分配
if (!bSafe) {
for(j=0;j<M;j++) {
iWork[j]+=iRequest[j];
iAllocation[i][j]-=iRequest[j];
iNeed[i][j]+=iRequest[j];
}
}
return bSafe;
}
阅读全文