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

📄 银行家.cpp

📁 银行家算法的实现程序
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#define M  3
#define N  5
#define A  15
int Available[M]={10,5,7};//可利用的资源向量
int  Need[N][M]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};//n个进程对m类资源最大需求量
int Allocation[N][M];//当前每类资源已分配给每个进程的资源数
/*********************初始化进程需求向量*******************/

int Request[M];

void InitiRequest()
{ 
    for( int i=0;i<M;i++){ cout<<"资源"<<i+1<<":";cin>>Request[i];}
}
/***************一维显示****************************/
void Show1(int m,int p[A])
{   
	
	for( int i=0;i<m;i++)
	{   
        cout<<"资源"<<i+1<<":";
		cout<<p[i]<<"  ";
	}
	cout<<endl;
}
/***************二维显示****************************/
void Show2(int p[N][M])
{  	
    cout<<"   ";
	for( int j=0;j<M;j++)cout<<"  资源"<<j+1;	
    cout<<endl;
    for( int i=0;i<N;i++)
	{    
		cout<<"进程P"<<i<<": ";
		for( int j=0;j<M;j++)cout<<p[i][j]<<"     ";
		cout<<endl;
	}
	
}
/********************数组复制函数***************/
int *Copy(int *p,int *t)
{
while( *p++=*t++);
return(p-1);
}

/****************两数组加减法运算****************/
void AddOrSub(int m,int p[A],bool k,int t[A])
{
    if(k)
	for(int i=0;i<m;i++)p[i]-=t[i];//K=1表示减法
   else for(int i=0;i<m;i++)p[i]+=t[i];//k=0表示加
}
/*************两数组比较*******************/

int Compare(int m,int p[A],int t[A])
{  int k=0;
	for(int i=0;i<m;i++)
	{ 
	 if(p[i]<=t[i])k--;
	 else k++;
	}
 if (abs(k)==m) return k/m;
 else return 0;

}
bool Cmp(bool p[N])
{  
	for( int i=0;i<N;i++)if(p[i]==0)return 0;
    return 1;
	
}
/*************安全性检测程序******************/
bool SaveCheck(int k)
{    
	int c=0,Work,t[N]; bool Finish[N]={0,0,0,0,0};
	for(int j=0;j<M;j++)
	{
      Work=Available[j];
      int i=k;
 
      while(i<N)
	  {  	 
	    if ( Finish[i]==0&&Need[i][j]<=Work)
		{
             Work+=Allocation[i][j];
             Finish[i]=1;
             t[c]=i;
             c++;
             i=0;
		}
	    else i++;
    
	  }
	}
   if(Cmp(Finish))
	{	
    cout<<"恭喜!:系统处于安全状态."<<endl;
    cout<<"本次安全序列:";
   for(j=0;j<N;j++)cout<<"进程"<<t[j]<<"->";
   cout<<endl<<endl;;
	return 1;

	}

	cout<<"警告!:系统处于不安全状态."<<endl;
	return 0;
}
/***************数据的改变试分配*****************/
void Changedata(int k)
{
               AddOrSub(M,Available,1,Request);
               AddOrSub(M,Allocation[k],0,Request);
		       AddOrSub(M,Need[k],1,Request);
}
/******************数据的恢复******************/
void 	 Recoverdata(int k)
{
               AddOrSub(M,Available,0,Request);
               AddOrSub(M,Allocation[k],1,Request);
               AddOrSub(M,Need[k],0,Request);
}
/***************银行家算法*****************/
void Banker(int k)
{  

	if( Compare(M,Request,Need[k])==-1)
	{   
		if(Compare(M,Request,Available)==-1)
		{      
            Changedata(k);
            if(SaveCheck(k))cout<<"正式将资源分配给进程"<<k<<endl;
		   else 
		   {
			 Recoverdata(k);
             cout<<"SORRY! 本次资源申请不成功!"<<endl;
             cout<<"让进程"<<k<<"等待!"<<endl;
		   }
		}
		else
		{
			cout<<"SORRY! 本次资源申请不成功!"<<endl;
			cout<<"让进程"<<k<<"等待!"<<endl;
		}
	}
	else cout<<" 错误,资源需求已过其宣布的最大值!"<<endl;
	
}
/***********显示数据的函数*********************/
void Showdata()
{
    
 cout<<"________________________________________________"<<endl;
	cout<<N<<"个进程对"<<M<<"类资源需求情况:"<<endl;
    Show2(Need);
    cout<<"________________________________________________"<<endl;
	cout<<"可利用的资源情况:"<<endl;
    Show1(M,Available);
    cout<<"________________________________________________"<<endl;
    cout<<"当前"<<M<<"类资源已分配给"<<N<<"个进程的资源数:"<<endl;
    Show2( Allocation);
   
    cout<<"________________________________________________"<<endl;
}
    
    
/*******************主函数演示****************/
int main()
{    

       int k;
	   char s;

    cout<<endl<<endl<<"              银行家算法演示程序   "<<endl;
	 do{
	Showdata();
	cout<<"要中止请输入N或n;继续则输入Y或y:";
	cin>>s;
	if(s=='N'||s=='n')break;
    cout<<"请输入进程号0--4:";
    cin>>k;
    cout<<"此进程需求对"<<M<<"类资源需求情况:"<<endl;
    InitiRequest();
    Banker(k);
  
	  }while(1);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -