📄 银行家算法fanxueping.cpp
字号:
//银行家算法
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
int available[3]={3,3,2};
int Max[6][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int allocation[6][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int need[6][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int live[5]={1,1,1,1,1};
int state[3][3]; //用来记录临时的试着为某进程分配资源时某进程的前状态
int request[3],process[5];
int i,j,p=5,pro,x,k1;
void zhibiao()
{ x=1;
cout<<"当前状态为:"<<endl;
cout<<" | Max | "<<" | All | "<<" | Need| "<<" |Avail|" <<endl;
cout<<"PRo A B C A B C A B C A B C"<<endl;
for(i=0;i<5;i++)
{ if(live[i]==1)
{ cout<<"P "<<i;
for(j=0;j<=2;j++)
{cout<<" "<<Max[i][j];}
cout<<"";
for(j=0;j<=2;j++)
{cout<<" "<<allocation[i][j];}
for(j=0;j<=2;j++)
{cout<<" "<<need[i][j];}
cout<<" ";
}
if(x==1&&live[i]==1) {cout<<" "<<available[0]<<" "<<available[1]<<" "<<available[2];x=0;}
if(live[i]==1) cout<<endl;
}
}
int apply()
{ int v=1;
for(i=0;i<=2;i++)
{if(need[pro][i]<request[i]) {v=0;break;} //需要的比申请的少时
if(available[i]<request[i]) {v=0;break;}} //可提供的比申请的少时
if(v==1){for(i=0;i<=2;i++)
{ //试着分配
state[0][i]=allocation[pro][i]; //用 state来记下试着分配前的状态
allocation[pro][i]+=request[i];
state[1][i]=need[pro][i];
need[pro][i]-=request[i];
state[2][i]=available[i];
available[i]-=request[i];}
}
return(v);
}
int safe() //安全性检查
{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
for(i=0;i<p;i++)
if(live[i]==0)
{finish[i]=1;k1--;} //看是否有进程已经结束
for(i=0;i<=2;i++) work[i]=available[i]; //最初work=available
while(1)
{ for(i=0;i<=4;i++)
{ if(finish[i]==0) //找到未完成的
{ v=1;
for(j=0;j<=2;j++)
if(need[i][j]>work[j])
{v=0;break;} //需要的大于现有的,则跳出
if(v==1) { finish[i]=1; //找到一个需要的资源小于现在有的
for(j=0;j<=2;j++) work[j]+=allocation[i][j];
available[j]=work[j];
//进程i完成,释放资源
process[k]=i;k++;
}
}
}
if(t==k) break;
else t=k;
if(k==k1) break;
}
if(k==k1) return(1);
else return(0);
}
main()
{
char ch;
cout<<"想要自动申请资源还是手动输入? y/n y-自动 n-手动";
cin>>ch;
while(p>0)
{ zhibiao(); //制表
k1=5; //进程数目
Sleep(100);
if(ch=='y')
{pro= static_cast<int>(0L+(5*static_cast<long>(std::rand()))/(RAND_MAX+1L));
while(live[pro]!=1&&(pro<4))
{ pro=pro+1;}
while (live[pro]!=1&&(0<pro<=4))
{ pro=pro-1;}
cout<<"进程"<<pro<<"申请资源"<<endl;
// srand((unsigned int) time(0));
for(int i=0;i<=2;i++)
{ if(p>=2) {request[i]=static_cast<int>(0L+((available[i]+1)*static_cast<long>(std::rand()))/(RAND_MAX+1L));}
if(p<2) {request[i]=static_cast<int>(0L+((need[pro][i]+1)*static_cast<long>(std::rand()))/(RAND_MAX+1L));}
//srand((unsigned int) time(0));
}
cout<<request[0]<<request[1]<<request[2];
cout<<"现在还有"<<p<<"个进程"<<endl;
}
if(ch=='n')
{cout<<"这个系统现在还有"<<p<<"个进程{0,1,2,3,4}"<<"请输入一个要申请资源进程"<<":P";
cin>>pro;
if(pro<0||pro>4) break;
cout<<"请输入该进程申请的三个资源各为"<<"(输入时2个资源数之间输入一个空格或逗号,输完后安回车键)"<<endl;
cin>>request[0]>>request[1]>>request[2]; }
if(apply()==0)
{cout<<endl<<"发生错误,资源不足或申请的大于需要的"<<"P"<<pro<<" 等待"<<endl;Sleep(1000);}
else if(safe()==0) {cout<<"不安全"<<"P"<<pro<<" wait!"<<endl;
for(i=0;i<=2;i++)
{ allocation[pro][i]=state[0][i]; //不安全时不给分配,状态恢复为原来的
need[pro][i]=state[1][i];
available[i]=state[2][i];} }
else {
if(request[0]==1||request[1]==1||request[2]==1)
{zhibiao();cout<<"安全!可以给以分配"<<endl; Sleep(1000);
cout<<endl<<" 存在一个安全系列:";
for(i=0;i<k1-1;i++)
cout<<"P"<<process[i]<<"->";
cout<<"P"<<process[k1-1];
Sleep(1000); }}
if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0) //判断某一进程是否已经完成,如果已完成,释放资源
{for(i=0;i<=2;i++)
{available[i]+=allocation[pro][i];
live[pro]=0;
}
cout<<endl<<"进程p"<<pro<<"已经完成,并释放资源";
p--;
Sleep(1000);
}
Sleep(2000);
}
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -