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

📄 银行家.txt

📁 实现了银行家算法
💻 TXT
字号:
#include <iostream.h> 
#define MAXPROCESS 50 //最大进程数 
#define MAXRESOURCE 100 //最大资源种数 
int AVAILABLE[MAXRESOURCE]; //可用资源数组 
int MAX[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵 
int ALLOCATION[MAXPROCESS][MAXRESOURCE]; //已分配矩阵 
int NEED[MAXPROCESS][MAXRESOURCE]; //现在还需要申请分配的资源数矩阵 
int REQUEST[MAXPROCESS][MAXRESOURCE]; //进程需要申请资源数 
bool FINISH[MAXPROCESS]; //记录系统是否有足够的资源分配,系统自动初始化其为false 
int temp[MAXPROCESS];//记录进程序列
int m,n; //m个进程,n种资源 
void show();
void Initial(); 
bool Safe(); 
void requese(); 
void main()
{int choice;
   int flag=1;
   Initial();
  while(flag)
  {cout<<"***************************请选择操作******************************"<<endl;
 cout<<"     1.查看资源分配情况     2.为作业申请资源     0.退出系统"<<endl;
 cout<<"请输入您的选择:" ;
 cin>>choice;
 switch(choice)
 {case 1:
 show();
 break;
 case 2:
requese();
break;
 case 0:
	flag=0;
    break;
 default:
	 cout<<"输入错误";
	 
 }
}

}
void Initial()  //初始化算法
{
    int i,j;
    cout<<"请输入进程的数目:";
    cin>>m;
    cout<<"请输入资源的种类:";
    cin>>n;
    cout<<"请输入每个进程最多所需的各资源数,按照"<<n<<"x"<<m<<"矩阵输入"<<endl;
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    cin>>MAX[i][j];
    cout<<"请输入每个进程已分配的各资源数,也按照"<<n<<"x"<<m<<"矩阵输入"<<endl;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>ALLOCATION[i][j];
            NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
            if(NEED[i][j]<0)
            {
                cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl;
                j--;
                continue;
            }
        }
    }
    cout<<"请输入各个资源现有的数目:"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>AVAILABLE[i];
    }
}

void requese()// 请求资源算法
{ 
   int i,number; 
  
  
	   cout<<"请输入需申请资源的进程号(从0到"<<m-1<<",否则重输入!):";
	   while(1)
	  { 
	      cin>>number;
	      if(number>=m){cout<<"您输入的进程号错误,请重新输入。"<<endl;continue;}
	       else break;
	   }
	  cout<<"请输入进程所请求的各资源的数量:"<<endl; 
	  for(i=0;i<n;i++) 
	  {   cout<<"资源"<<i<<":";
	      cin>>REQUEST[number][i]; 
		   if(REQUEST[number][i]>NEED[number][i]) 
		      { 
			  cout<<"您输入的请求数超过进程的需求量!请求错误"<<endl;  
			   goto A;
		      } 
	           if(REQUEST[number][i]>AVAILABLE[i]) 
		      { 
			  cout<<"您输入的请求数超过系统有的资源数!请求错误!"<<endl;
				   goto A;
		      } 
          } 
	  for(i=0;i<n;i++) 
	  { 
		AVAILABLE[i]=AVAILABLE[i]-REQUEST[number][i]; 
		ALLOCATION[number][i]+=REQUEST[number][i]; 
		NEED[number][i]-=REQUEST[number][i]; 
	  } 
	  if(Safe()) //调用安全算法safe(),检验能否分配
    		{ cout<<"同意分配请求!"<<endl; } 
  	    else 
    		 { cout<<"您的请求被拒绝!"<<endl; 
      		   for(i=0;i<n;i++) //进程申请资源失败后归还资源
        		 { 
         		   AVAILABLE[i]=AVAILABLE[i]+REQUEST[number][i]; 
	 		   ALLOCATION[number][i]-=REQUEST[number][i]; 
         		   NEED[number][i]+=REQUEST[number][i]; 
       			  } 
     		 } 
	  for(i=0;i<m;i++)// FINISH变量返回到初始化状态
   		 { FINISH[i]=false; } 
	   
	
A: ;} 

bool Safe() //检查安全性算法 
{ 
    int i,j,k,l=0; 
    int Work[MAXRESOURCE]; //工作数组 
    for(i=0;i<n;i++) 
         Work[i]=AVAILABLE[i]; 
    for(i=0;i<m;i++) 
         FINISH[i]=false;  
   for(i=0;i<m;i++) 
	{  
		if(FINISH[i]==true) continue;
                                            else
		    {    
			      for(j=0;j<n;j++) 
				  { 
					  if(NEED[i][j]>Work[j]) 
					  break; 
				  } 
             	                                            if(j==n) 
				  { FINISH[i]=true;
                                                 for(k=0;k<n;k++) 
						{ 
							Work[k]+=ALLOCATION[i][k];
						} 
                                                  temp[l++]=i; 
                                                  i=-1; 
				  } 
                                 else continue;
		} 
    if(l==m) 
		{ 
               cout<<"系统是安全的"<<endl; 
               cout<<"安全序列:"<<endl; 
               for(i=0;i<l;i++) 
                   { 
                      cout<<temp[i]; 
                      if(i!=l-1) 
                          cout<<"-->"; 
                   } 
              cout<<endl; 
              return true; 
		}
	} 
   cout<<"系统是不安全的"<<endl; 
   return false; 
}

void show()
{
    int i,j;
    cout<<"系统可用的资源数为:"<<endl<<endl;
    cout<<"      ";
    for (j=0;j<n;j++)cout<<"  资源"<<j<<":  "<<AVAILABLE[j];
      cout<<endl;
      cout<<endl;
      cout<<"        各进程还需要的资源量:"<<endl<<endl;
     for (i=0;i<m;i++)
	 {
        cout<<"进程"<<i<<":";
        for (j=0;j<n;j++)cout<<"  资源"<<j<<":  "<<NEED[i][j];
        cout<<endl;
	 }
    cout<<endl;
     cout<<"        各进程已经得到的资源量:  "<<endl<<endl;
    for (i=0;i<m;i++)
	{
       cout<<"进程"<<i<<":";
       for (j=0;j<n;j++)cout<<"  资源"<<j<<":  "<<ALLOCATION[i][j];
        cout<<endl;
	}
    cout<<endl;
}

 

⌨️ 快捷键说明

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