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

📄 yhjsf.cpp

📁 这是我做的操作系统小设计 多资源银行家算法 包括了代码和文档
💻 CPP
字号:
#include "iostream"
using namespace std;

int M;  //资源种类
int P;  //进程数目
int flag;


struct process{ //虚拟PCB 
    char name[10]; //进程名
	int  *H;   //已分配资源
	int  *N;   //尚需资源
	int  *R;   //申请资源
    int  finish;

};

void PRIN(process *PROCE,int *source,int M,int P){//y为第几次输出
  cout<<"*******************************************************"<<endl;
  cout<<"进程名     以分配设备      尚需设备      当前可用设备  "<<endl;
                  
  cout<<"设备编号        ";                                              
  for(int q=0;q<3;q++){
     for(int I=0;I<M;I++)cout<<I<<" ";
     cout<<"        "; 
  }
  cout<<endl;
  
  int i;
  int pp=0;
  flag=0;
  for(int e=0;e<P;e++){
   if(PROCE[e].finish==0){
     pp=1;//有进程得到满足,有输出
	 cout<<"      "; 
	 cout<<PROCE[e].name;                      cout<<"        "; 
     for(i=0;i<M;i++)cout<<PROCE[e].H[i]<<" "; cout<<"        "; 
     for(i=0;i<M;i++)cout<<PROCE[e].N[i]<<" "; cout<<"        "; 
     if(flag==1)cout<<endl;
     if(flag==0){for(i=0;i<M;i++)cout<<source[i]<<" ";flag=1;cout<<endl; } 
	 
   }               
   
   
    
  }
  if(pp==0){cout<<"                                           ";
            for(i=0;i<M;i++)cout<<source[i]<<" ";
			cout<<endl; 
  
  }
  cout<<"*******************************************************"<<endl;

}


int ISSAFE(process *PROCE,int *source,int M,int P,int *no){
 int i=0,j=0,k=0;
 
   
   

   for(int h=0;h<P;h++){
     for(j=0;j<P;j++){ 
       
       if(PROCE[j].finish==0){     //进程PROCE[i]尚未完成
         for(k=0;k<M;k++){  
           if(PROCE[j].N[k]>source[k]){break;}      
         }        
         if(k==M){
			       for(int h=0;h<M;h++)
				   {       
                     source[h]+=PROCE[j].H[h];
                   }
				   PROCE[j].finish=1;
                 
                   no[i]=j;//进程完成序列
                   PRIN(PROCE,source, M, P);
				    i++;
                   getchar();
                  
                  
         }
       }

	 } 
       if(i==P){return 1;}//安全 
   }
      
   return 0;//不安全
}







int TEST(process *PRO,int *SOURCE,int M,int P){
  int number=0;
  int *no;  
    no=new int[P];//安全序列 
	for(int k=0;k<P;k++)
		no[k]=0; 
  int i=0,j=0;
  process *PROCE=new process[P];
  int *source; 
  
  source=new int[M];
  for(i=0;i<M;i++)
      source[i]=SOURCE[i];

   
    for(i=0;i<P;i++){
       PROCE[i].H=new int[M];
       PROCE[i].N=new int[M];
       PROCE[i].R=new int[M];
       PROCE[i].finish=0;
	  
	   for(j=0;j<M;j++){
	     PROCE[i].H[j]=PRO[i].H[j];	
	     PROCE[i].N[j]=PRO[i].N[j];
	     PROCE[i].R[j]=PRO[i].R[j];
	}
	   
    }
   for(i=0;i<P;i++){
	for(j=0;j<10;j++){
	 PROCE[i].name[j]=PRO[i].name[j];
	}
   }
  

  PRIN(PROCE,source, M, P);	
  getchar();
  do{
      cout<<"请输入请求资源的进程编号:";
      cin>>number;
      if(number>=P||number<0)
		  cout<<"输入进程编号非法!"<<endl;
   }while(number>=M||number<0);
                                
   
   
   cout<<"请输入进程"<<number<<"请求的各资源数目:"<<endl;//输入请求序列
    cout<<"资源号为:";
	  for(j=0;j<M;j++)
	    cout<<j<<" ";
	  cout<<endl;
	  
	  cout<<"         ";
	  for(j=0;j<M;j++)
        cin>>PROCE[number].R[j]; 
   


  
  //************************银行家算法************************** 
  
  for(i=0;i<M;i++){ 
    if(PROCE[number].R[i]>PROCE[number].N[i]){
      cout<<"出错!R"<<i<<"大于"<<"P"<<i<<"尚需资源"<<endl;
      return 0;
    }
  }

  for(i=0;i<M;i++){
    if(PROCE[number].R[i]>source[i]){ 
      cout<<"出错!R"<<i<<"大于"<<"系统可用资源"<<endl;
        
    }
  }  
     
  
  for(i=0;i<M;i++){  
    source[i]=source[i]-PROCE[number].R[i];
    PROCE[number].H[i]=PROCE[number].H[i]+PROCE[number].R[i];
    PROCE[number].N[i]=PROCE[number].N[i]-PROCE[number].R[i];
  }
  
  
  int FLAG=0;     
  FLAG=ISSAFE(PROCE,source, M, P,no); //判断是否安全	
  if(FLAG==1){cout<<"安全序列:"<<endl;  
              for(i=0;i<P;i++)cout<<no[i]<<"  ";  
              cout<<endl;
  }
  




  if(FLAG=0){cout<<"警告:当前状态不安全!不存在安全序列!"<<endl;}
 
  free(source);
  free(PROCE);


}

void main(){
    
    //系统初始化 
	//*******************************************************

	cout<<"请输入进程数:";
	cin>>P;
	cout<<"请输入系统总的资源种类数:";
	cin>>M;
    
	

    process *PRO=new process[P];
    
    int i=0,j=0;
    for(i=0;i<P;i++){
       PRO[i].H=new int[M];
       PRO[i].N=new int[M];
       PRO[i].R=new int[M];
       PRO[i].finish=0;
	   for(j=0;j<M;j++){
	     PRO[i].H[j]=0;	
	     PRO[i].N[j]=0;
	     PRO[i].R[j]=0;
	   }
	
	}
    //*******************************************************
 
	
	//输入系统初态
    //*******************************************************

	cout<<"输入系统初态"<<endl;
    
	
	for(i=0;i<P;i++){
	  
	  cout<<"请输入进程"<<i<<"名称:";
	  cin>>PRO[i].name;
	   
	  cout<<"请输入进程"<<i<<"已获得的各资源数目"<<endl;
	  
	  cout<<"资源号:";
	  for(j=0;j<M;j++)
	    cout<<j<<" ";
	  cout<<endl;
	  
	  cout<<"       ";
	  for(j=0;j<M;j++)
        cin>>PRO[i].H[j];
	
	  
	  cout<<"请输入进程"<<i<<"尚需分配的各资源数目"<<endl;
	  
	  cout<<"资源号:";
	  for(j=0;j<M;j++)
	    cout<<j<<" ";
	  cout<<endl;
	  
	  cout<<"       ";
	  for(j=0;j<M;j++)
        cin>>PRO[i].N[j];
	
	}	
   
    
    int *SOURCE=new int[M];//当前系统可用资源
	
	cout<<"请输入系统当前可用的各资源数目:"<<endl;
    cout<<"资源号:";
	  for(j=0;j<M;j++)
	    cout<<j<<" ";
	  cout<<endl;
	  
	  cout<<"       ";
	  for(j=0;j<M;j++)
        cin>>SOURCE[j];
	
    //*******************************************************
      
	  while(1){
	  TEST(PRO,SOURCE,M,P);
	  
	  }
 

}

⌨️ 快捷键说明

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