#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;
}
#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;
}