⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 银行家算法fanxueping.cpp

📁 实现经典的银行家算法、是一个很好的演示程序、可用于讲解操作系统课程
💻 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 + -