银行家问题
来源:互联网 发布:轻量级linux安装详解 编辑:程序博客网 时间:2024/05/19 16:36
#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;
}
0 0
- 银行家问题
- 银行家算法问题
- 银行家问题实验
- 死锁问题及银行家算法
- 银行家算法解决死锁问题
- 银行家算法避免死锁问题
- 银行家算法解决死锁问题
- 数据库死锁问题及银行家算法
- 《操作系统》 死锁问题以及银行家算法解决
- excel 中关于银行家舍入的问题
- 那时候的银行家算法 处理计算机思索避免问题
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- selenium的进阶1
- c语言链表操作
- Servlet处理HTTP请求(2)
- JAVA&Adroid多线程实现
- 【安卓】安卓App开发思路 一步一个脚印(五)多点触碰与单点触碰的冲突处理思路
- 银行家问题
- Python做科学计算---matplotlib
- 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)
- ogre2.1学习(一)Sample_Tutorial01_Initialization
- selenium进阶2
- 机器学习资源汇总(持续更新)
- 10.模型
- 总结HashMap 和HashTable的区别
- hdu1059_Dividing