银行家问题

#include "iostream.h"
#include "windows.h"


const int N=5,M=3;
//int Max[N][M]={0};//各进程所需各类资源的最大需求
//int Available[M]={0};//系统可用资源
//int Allocation[N][M]={0};//系统已分配资源
int Max[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Available[M]={10,5,7};
int Allocation[N][M]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int Need[N][M]={0};//还需要资源
int Request[M]={0};//请求资源向量
char *Name[]={"P0", "P1", "P2", "P3","P4"};
int Work[M]={0};//存放系统可提供资源
void ShowResourceTable( );
void Alloc(int i);
void RollBack(int i);
bool IsSafe();


int main()
{
int i,j;bool YN;
cout<<"\n\n=====================================";
cout<<"\n   Banker\'s   Algorithm  in   C++           ";
cout<<"\n=====================================\n\n";
/*cout<<"输入系统提供ABC三类资源的最大量"<<endl;
for(j=0;j<M;j++)
cin>>Available[j];
cout<<"输入各进程对资源的最大需求量,建立Max矩阵"<<endl;
 for(i=0;i<N;i++)
    for(j=0;j<M;j++)
      cin>>Max[i][j];
cout<<"输入系统给各进程已分配资源,建立Alloacton矩阵"<<endl;
 for(i=0;i<N;i++)
    for(j=0;j<M;j++)
      cin>>Allocation[i][j];*/
for(i=0;i<N;i++)
    for(j=0;j<M;j++)
      Need[i][j]=Max[i][j]-Allocation[i][j];


ShowResourceTable();
for(j=0;j<M;j++)
  for(i=0;i<N;i++)
    Available[j]-=Allocation[i][j];
cout<<endl<<"自动生成Available数组:";
for(j=0;j<M;j++)
cout<<Available[j]<<"  ";
cout<<endl;
IsSafe();
while(TRUE)
{
cout<<endl<<"请输入申请资源的进程号(0-4),其他值退出:"; 
cin>>i;
if(!(i==0||i==1||i==2||i==3||i==4)) break;
cout<<endl<<"请输入进程 "<<i<<" 申请的资源:"<<endl;
for(j=0;j<M;j++)
cin>>Request[j];//输入需要申请的资源
YN=TRUE;
for (j=0;j<M;j++)

if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错,是否合理?

cout<<"进程 "<<i<<"申请的资源大于它需要的资源";
cout<<" 非法申请,不予分配!"<<endl;
YN=FALSE;
break;
}
else 
{
             if(Request[j]>Available[j])//判断申请是否大于当前资源,若大于则出错,是否合法?
{
cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";
cout<<" 分配出错,不予分配!"<<endl;
YN=FALSE;
break;
}
         }
    }
    if(YN) 
{
Alloc(i);//根据进程需求量尝试分配资源
ShowResourceTable();//根据进程需求量显示变换后的资源
if(!IsSafe())  RollBack(i);//根据进程需求量进行银行家算法判断
    }
}
return 0;
}


void ShowResourceTable( )//显示资源分配表
{
  cout<<"       Max     Allocation   Need "<<endl;
  for(int i=0;i<N;i++)
     cout<<Name[i]<<"   "<<Max[i][0]<<"  "<< Max[i][1]<<"  "<< Max[i][2]<<"    "<< Allocation[i][0]<<"  "<< Allocation[i][1]<<"  "<< Allocation[i][2]<<"    "<<Need[i][0]<<"  "<< Need[i][1]<<"  "<< Need[i][2]<<endl;
}
void  Alloc(int i)//进行资源分配

for (int j=0;j<M;j++) 
{
      Available[j]=Available[j]-Request[j];
      Allocation[i][j]=Allocation[i][j]+Request[j];
      Need[i][j]=Need[i][j]-Request[j];
}
}
void  RollBack(int i)//撤销资源分配

for (int j=0;j<M;j++) 
{
      Available[j]=Available[j]+Request[j];
      Allocation[i][j]=Allocation[i][j]-Request[j];
      Need[i][j]=Need[i][j]+Request[j];
}
}


bool  IsSafe()//安全性算法
{
bool Finish[N]={FALSE},Flag=TRUE;
int i,j,k,count=0;
char Order[N]={'\0'};//存放安全序列
Work[0]=Available[0];
Work[1]=Available[1];
Work[2]=Available[2];
cout<<endl;
    cout<<"       Work        Need    Allocation  Work+Allocation   Finish "<<endl;
for(k=0;k<N;k++)
for(i=0;i<N;i++)
{
    if(Finish[i]==FALSE)

Flag=TRUE;
for(j=0;j<M;j++) 
if(Need[i][j]>Work[j]) Flag=FALSE;
if(Flag)
{
cout<<Name[i]<<"   "<<Work[0]<<"  "<<Work[1]<<"   "<<Work[2]<<"    ";
   for(j=0;j<M;j++)
Work[j]=Work[j]+Allocation[i][j];//变分配数
Finish[i]=TRUE;
                        cout<< Need[i][0]<<"  "<< Need[i][1]<<"  "<< Need[i][2]<<"    "<<Allocation[i][0]<<"  "<<Allocation[i][1]<<"  "<<Allocation[i][2];
cout<<"      "<<Work[0]<<"  "<<Work[1]<<"  "<<Work[2]<<"          "<<Finish[i]<<endl;
Order[count++]=i+'0';
break;
}
}
}


for(i=0;i<N;i++)
if(Finish[i]==FALSE)
{
cout<<"系统不安全"<<endl;//不成功系统不安全
return FALSE;
}
cout<<"系统是安全的!";//如果安全,输出成功
cout<<"并且进程的安全序列为:";
for(i=0;i<N;i++)
  cout<<"P"<<Order[i]<<" ";
cout<<endl;
 
return TRUE;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值