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

📄 os.cpp

📁 银行家算法
💻 CPP
字号:
#include <stdio.h>
#include <cstring>
void main()
{    
	int m,n;
	int i,j;
	int* Avi;
	Avi = new int[m];
	int* Work = new int[m];
	int** Max;
	int** Allocation;
    int** Need;
	int** Request;
	int Maxavi ;
	int Renum;
	int cycle = 1;
	char Bigcycle;
	int AllExcetion = 0;
	int *Finish = new int[n];
	
    printf("请输入资源总数和各资源数:\n");
	printf("资源总数:");
	scanf("%d",&m);
	for(i = 0;i<m;i++){
		char q = i+'A';
		printf("资源%c:",q);
    	scanf("%d",&Avi[i]);
	}
	Maxavi = Avi[0];
	fflush(stdout);
	printf("请输入进程总数:");
	scanf("%d",&n);
	printf("各进程所需最大资源!\n");
	Max = new int*[n];
	for(i = 0;i<n;i++){
		Max[i] = new int[m];
		for(j = 0;j<m;j++){
			printf("P%d",i);
			char c = j + 'A';
			printf("-->%c:",c);
			scanf("%d",&Max[i][j]);
			if(Avi[j]<Max[i][j]){
				printf("没有足够大的资源供分配,请重新输入!\n");
				j--;
			}
		}
	}
    printf("请输入各进程T0时刻分配的资源!\n");
	Allocation = new int*[n];
	for(i = 0;i<n;i++){
		Allocation[i] = new int[m];
		for(j = 0;j<m;j++){
			printf("P%d",i);
			char c = j + 'A';
			printf("-->%c:",c);
			scanf("%d",&Allocation[i][j]);
			
		}
	}
	for(j=0;j<m;j++){
				int count = 0;
				for(i = 0;i<n;i++){
					count += Allocation[i][j];
				}
					Avi[j] = Avi[j]-count;
			}
	//Init(Allocation,m,n);
	do{
		do{
			printf("请输入进程号和请求资源的数目!");
			Request = new int*[n];
			for(i = 0;i<n;i++){
				Request[i] = new int[m];
				for(j = 0;j<m;j++){
					Request[i][j] = 0;
				}
			}
			printf("\n进程号:P");
			scanf("%d",&Renum);
			printf("\n请求资源数:");
			
			for(j = 0;j<m;j++){
				int N = Max[Renum][j]-Allocation[Renum][j]; 
				char c = j +'A';
				printf("%c:",c);
				scanf(" %d",&Request[Renum][j]);
				if(Request[Renum][j]>N){
					printf("\nERROR!超出Need.重新输入请求资源数:");
					j--; 
					
				}
				else if(Request[Renum][j]>Avi[j]){
					printf("尚无足够资源请等待!");
					for( i = 0;i<m;i++){
						Request[Renum][i] = 0;
						
					}
					cycle = 1;
					break;
				}
				else {
					cycle = 0;
					printf("hello!");
				}
			}
		}while(cycle);
		printf("各进程所需资源:");
		Need = new int*[n];
		for(i = 0;i<n;i++)
		{   
			Need[i] = new int[m];
			printf("\nP%d:",i);
			for(j = 0;j<m;j++){
				Allocation[i][j] =Allocation[i][j]+Request[i][j];
				Need[i][j] = Max[i][j]-Allocation[i][j];
				if(Need[i][j]==0||Need[i][j]==Max[i][j]){
					AllExcetion++;
					printf("%2d",Need[i][j]);
				}
				else
					printf("%2d",Need[i][j]);
			}
			//if(AllExcetion == m){
				//printf("  次进程已经执行完毕,处于等待中!");
			//}
			
		}	
		
		printf("\nAvailable:");
		for(j=0;j<m;j++){
			for(i = 0;i<n;i++)
			{   
				if(Need[i][j]==0){
					Avi[j]+=Allocation[i][j]-Request[i][j];
					Allocation[i][j] = 0;
				}
				else Avi[j] = Avi[j]-Request[i][j];
			}
			printf(" %d",Avi[j]);
			
		}
	   int p = 1;
	   int *show = new int[n];
	   int showNum = 0;
	   
	  
	   int Record ;
	   for(int f = 0;f<m;f++)  //保存AVI中的内容
		  Work[f] = Avi[f];
	   for(i = 0;i<n;i++){
		  Finish[i] = 0;
	   }
	  
	   while(p){
			Record = Work[0];
			for(i = 0;i<n;i++){
				if(Finish[i]==0){
					for(j = 0;j < m;j++){
						if(Work[j]>=Need[i][j]){
							
							p =1;
						}
						else{
							p = 0;
							break;
						} 
					}
					
					if(p==1){
						for(int s = 0;s<m;s++){
							Work[s] += Allocation[i][s];
						}
						Finish[i] = 1;
						show[showNum] = i;
						showNum++;
					}
				}
			}
			if(Record==Work[0]||Work[0]==Maxavi){
				p = 0;
			}
			else{
				p = 1;
			}
		}
	  
	   if(Work[0] == Maxavi){
			printf("\n安全!!!");
			printf("\n安全序列是:");
			for(i= 0;i<n;i++){
				printf("-->P%d",show[i]);
			}
			printf("\n有进程发出Request请求向量吗?<Enter y or n>");
			fflush(stdin);
			scanf("%c",&Bigcycle);
	   }
	   else  {
		   printf("\n这种配置不安全会死锁!!!");
		   Bigcycle = 'n';
		   
	   }
  }while(Bigcycle=='y');
	scanf("%d",m);
 
}

⌨️ 快捷键说明

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