银行家算法1.cpp

来自「这是一个关于操作系统银行家算法的程序」· C++ 代码 · 共 312 行

CPP
312
字号
#include<iostream.h>

int A[4]={1,1,1,1};   //可分配的资源数
    int N[5][4]={{2,1,0,0},{0,1,1,1},{3,1,0,0},{0,0,1,0},{2,1,1,0}};    //尚缺资源数
    int U[5][4]={{3,0,1,1},{0,1,0,0},{1,1,1,0},{1,1,0,1},{0,0,0,0}};  //已占资源数
	int RR[5][4];
    int i,j,k;
  int a[5]={0,0,0,0,0};          //检验是否所有的进程都能顺利运行
   int c,d,e;
    	 int R; int Rr;  

void choice5()
{
	cout<<"  谢谢使用该程序!\n\n";
				 cout<<"        风过无痕!\n";
}

void display()
{
	char name[5][3]={"P1","P2","P3","P4","P5"};
	cout<<"各进程已经获得各资源数如下:\n";
	cout<<"  进程名  磁带驱动器   绘图仪    打印机    穿孔机\n";
	for (i=0;i<5;i++)
	{ cout<<"    "<<name[i];
		for (j=0;j<4;j++)
	       cout<<"         "<<U[i][j];
	     cout<<"\n";
	}
      cout<<"\n";
   cout<<"各进程还需的各资源数如下:\n";
   cout<<"  进程名  磁带驱动器   绘图仪    打印机    穿孔机"<<"\n";
    for (i=0;i<5;i++)
	{ cout<<"    "<<name[i];
		for (j=0;j<4;j++)
	   	    cout<<"         "<<N[i][j];
	    cout<<"\n";
	}
	cout<<"\n";

    cout<<"当前系统所能提供的各资源数如下:\n";
	cout<<"   磁带驱动器  绘图仪   打印机   穿孔机\n";
		 for(i=0;i<4;i++)
     cout<<"        "<<A[i];
		cout<<"\n\n";
}

void choice1()
{
for(;;)
	   {
		cout<<"请问您想运行1---5个进程中的哪一个呢?\n";      //开始运行进程
			cin>>k;
	if (k>5)
		cout<<"  进程"<<k<<"不存在!\n\n";
	else break;
	   }
}

 void RR1()    //比较该进程当前请求的各资源数与该进程还需的各资源数的大小!
 {
     for (i=0;i<4;i++)
  {
     if (RR[k-1][i]<=N[k-1][0]) continue;
     else 
	 { R=0;
	   break;
	 }
	 R=1;
  }
 }
  
void RR2()    //比较该进程当前请求的各资源数与当前系统所能提供的资源数的大小
 {
	 for (j=0;j<4;j++)
  {
     if (RR[k-1][j]<=A[j]) continue;
     else 
	 { Rr=0;
	   break;
	 }
	 Rr=1;
  }
}

void choice2()
{
	cout<<"请依次输入该进程当前请求的各资源数\n";     //输入该进程当前请求的各资源数
		 for(i=0;i<4;i++)                           
	    	cin>>RR[k-1][i];
		 cout<<"\n";
		 cout<<"该进程当前请求的各资源数为:\n";
		cout<<"   磁带驱动器  绘图仪   打印机   穿孔机\n";
		 for(i=0;i<4;i++)
     cout<<"        "<<RR[k-1][i];
		cout<<"\n\n";

cout<<"1、比较该进程当前请求的各资源数与该进程还需的各资源数的大小:\n\n";
   RR1();			
	if(R=1)
		  {
			 cout<<"  该进程当前请求的各资源数小于该进程还需的各资源数!\n  请按任意键运行下一步!\n\n";
			char l;	
	       cin>>l; 
		  }  
		  else
		  {
     cout<<"!!错误警告:\n 该进程当前请求的资源数大于该进程还需要的各资源数!\n 请重新输入!\n\n(1)、重新选择运行新进程请按'1'\n";
			 cout<<"(2)、重新输入该进程当前请求的各资源数请按'2'\n";
			  char m;
		   cin>>m;
			if(m=='1')  choice1();
            if(m=='2')  choice2();
		  }
}

void compare()
{
     cout<<"2、比较该进程当前请求的各资源数与当前系统所能提供的资源数的大小:\n\n";
	  RR2();
  	   if(Rr=1)
		  {
		   cout<<"  该进程当前请求的资源数小于当前系统所能提供的资源数!\n  请按任意键运行下一步!\n\n";
		      char o; 
       cin>>o;
	   }
	   	   else
	   {
	   cout<<"!!错误警告:\n 该进程当前请求的资源数大于当前系统所能提供的资源数!\n 进程进入等待!\n\n";				  
		  cout<<"(2)、重新输入该进程当前请求的各资源数请按'2'\n";
		cout<<"(1)、重新选择运行新进程请按'1'\n";
		 char n;		  
	   cin>>n;
			if(n=='1')  choice1();
		if(n=='2')  choice2();
		   }
}

void pass()
{
	cout<<"安全状态检验结果如下:\n\n";
      cout<<"至少存在一条通路可使每个进程都能完成!\n";
          cout<<"该路径中各进程完成的顺序依次为:\n";
		  for (j=0;j<5;j++)
		  { cout<<"    p["<<a[j]<<"]";
		  }
		  cout<<"\n\n";
		   cout<<"  即:此状态是安全状态!所以给当前运行的进程"<<k<<"分配当前所请求的资源!\n\n";
	    cout<<"(1)、重新选择运行新进程请按'1';\n(2)、重新输入该进程当前请求的各资源数请按'2'\n";
		 cout<<"(3)、结束请按'3'\n\n";
		  char t;
		  cin>>t;
           if(t=='3')  
			   {
	cout<<"  谢谢使用该程序!\n\n";
				 cout<<"        风过无痕!\n";
}

			for (i=0;i<4;i++) 
			 { A[i]=A[i]+RR[k-1][i];              //恢复当前运行进程的数据到假分配前的状态
				 U[k-1][i]=U[k-1][i]-RR[k-1][i];
		  N[k-1][i]=N[k-1][i]+RR[k-1][i];
			 }
		  cout<<"当前系统所能提供的各资源数恢复为假分配前的数值:\n  如下:\n";
		 cout<<"   磁带驱动器  绘图仪   打印机   穿孔机\n";
		 for(i=0;i<4;i++)
     cout<<"        "<<A[i];
		 cout<<"\n\n";	
			  if(t=='1')   choice1();
				  if(t=='2')  choice2();
}

void resource()
{
     cout<<"系统为当前运行的进程进行资源的假分配:\n\n";
   for (i=0;i<4;i++)                         //假分配资源
	  {    A[i]=A[i]-RR[k-1][i];
	     U[k-1][i]=U[k-1][i]+RR[k-1][i];
		  N[k-1][i]=N[k-1][i]-RR[k-1][i];	
		}
   cout<<"资源假分配后当前系统所能提供的各资源数A为:\n";
   cout<<"  磁带驱动器  绘图仪   打印机    穿孔机\n";  //生成新的状态 
       for (i=0;i<4;i++)           
	   { 
		   cout<<"        "<<A[i];
	   }
    cout<<"\n";
     cout<<"资源假分配后该进程已经获得各资源数U如下:\n";
     cout<<"  磁带驱动器  绘图仪   打印机    穿孔机\n"; 
	for (i=0;i<4;i++)  
	   {
		cout<<"        "<<U[k-1][i];
	   }
    cout<<"\n";
     cout<<"资源假分配后该进程还需的各资源数N如下:\n";
      cout<<"  磁带驱动器  绘图仪   打印机    穿孔机\n"; 	
	for (i=0;i<4;i++) 
	   {cout<<"        "<<N[k-1][i];
	   }
   cout<<"\n\n";
cout<<"按任意键进行安全状态检验.........\n";
}

void secure()
{
  char o;
  cin>>o;

  int W[4];                     //安全状态检验
   int F[5]={0,0,0,0,0};
   int q;

   for (q=0;q<4;q++)            //初始化W[4],即:W[4]=A[4]
	 {  W[q]=A[q];
   }
   c=0;
   for (e=0;e<5;e++)
   {
	   if (F[e]==1) continue;
     else if (F[e]!=1)
	 { 
		 if (N[e][0]<=W[0] && N[e][1]<=W[1] && N[e][2]<=W[2] && N[e][3]<=W[3])
		 { F[e]=1;
		 for(j=0;j<5;j++)
               W[j]=W[j]+U[e][j];
		 
			   for(j=0;j<5;j++)
				   { 
				   if (a[j]==0)
				   {
                      a[j]=e+1;
					  if (a[4]!=0) choice2();
					  break;
				   }
                   else continue;
				   }
		 }
	 }
  loop: i=0;
	 for(i=0;i<5;i++)
	 { 
		   c++;
		  if (c==20)
			{ 
			  c=0;
			 for (d=0;d<5;d++)
				{ 
				 a[d]=0;         //清空队列
				 F[d]=0;         //重新初始化F[]
				} 
	      break;
			}
          if (F[i]==1) continue;
		 else if (F[i]!=1)
		 {
	       if (N[i][0]<=W[0] && N[i][1]<=W[1] && N[i][2]<=W[2] && N[i][3]<=W[3])
			 { F[i]=1;
		   for (j=0;j<5;j++)
               W[j]=W[j]+U[i][j];
			   for(j=0;j<5;j++)
			   { 
				   if (a[j]==0)
				   {
                      a[j]=i+1;
					  if (a[4]!=0) pass();
					  break;
				   }
                   else continue;
			   }
			  goto loop;
			 }
		   }
		   else continue;
	 }
   }
 cout<<"安全状态检验结果如下:\n\n不是所有进程都能完成!\n";
	  cout<<"  即:此状态是不安全状态!所以不给当前运行的进程"<<k<<"分配当前所请求的资源!\n\n";
		 		 for (i=0;i<4;i++) 
			 { A[i]=A[i]+RR[k-1][i];
				 U[k-1][i]=U[k-1][i]-RR[k-1][i];
		  N[k-1][i]=N[k-1][i]+RR[k-1][i];
			 }
		  cout<<"当前系统所能提供的各资源数恢复为假分配前的数值:\n  如下:\n";
		 cout<<"   磁带驱动器  绘图仪   打印机   穿孔机\n";
		 for(i=0;i<4;i++)
     cout<<"        "<<A[i];
		 cout<<"\n\n";
		 cout<<"(1)、重新选择运行新进程请按'1';\n(2)、重新输入该进程当前请求的各资源数请按'2'\n";
		cout<<"(3)、结束请按'3'\n\n";	
		   char s;
		  cin>>s;
			  if(s=='1')   
				  choice1();
			if(s=='2')  
					 choice2();	
               if(s=='3')  
				   choice5();
} 

void main()
{
	display();
	choice1();
	choice2();
	compare();
	resource();
	secure();
}




     

⌨️ 快捷键说明

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