用C语言实现银行家算法

代码展示

#include<stdio.h>

#define M 10
#define N 10				//N(n)表示进程数,M(m)表示资源数

int n,m,i,j,num=0;
int available[M],available1[M];				//可利用资源数
int max[N][M];								//最大需求数
int allocation[N][M],allocation1[N][M];		//已分配进程资源数
int need[N][M],need1[N][M];					//仍需资源数
int work[M];								//工作向量,表示系统提供给进程继续运行所需的各类资源数目,含m个元素
int finish[N];								//表示系统是否有足够的资源分配给进程,含n个元素,值为0或1,0表示false,1表示true
int sequence[N];							//表示处于安全状态时的进程顺序
int progressNum;
int requst[M];								//更改进程种类
//安全性算法检查

int judge(int i){
	for(j=0;j<m;j++){
	//	printf("need1[%d][%d]=%d,work[%d]=%d\n",i,j,need1[i][j],j,work[j]);
		if(need1[i][j] > work[j]){
			return 0;
		}
	}
	return 1;
}

int safe(){
	int s=0;//s判断是否改变状态
	for(j=0;j<m;j++)
		work[j] = available1[j];

	for(i=0;i<n;i++)
		finish[i] = 0;
	
	while(true){

		for(i=0;i<n;i++)
		{
			if(finish[i]==0)
			{	
				if(judge(i))
				{
					s = 1;
					sequence[num++] = i;
					for(j=0;j<m;j++)
					{
						work[j] = work[j] + allocation1[i][j];
						finish[i] = 1;
					}
				}
			}
		}
		if(s == 0){
			break;
		}
		s=0;
	}
	if(num == n){
		return 1;	
	}else{
		return 0;
	}

}

//请求资源判断
int testRequst(){

	for(j=0;j<m;j++){
		if(requst[j]>need[progressNum][j]||requst[j]>available[j]){
			return 0;
		}
	}
	return 1;
}


void main(){
	char change ='y';
	printf("输入进程数:\n");
	scanf("%d",&n);  
	printf("输入资源的种类:\n");
	scanf("%d",&m);
	
	printf("输入每个进程最多所需的各类资源数,按照%d×%d矩阵输入:\n",n,m);
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&max[i][j]);
		}
	}
/*	//输出最大需求数
	printf("Max:\n\t");
	for(i=0;i<m;i++){
		printf("%c\t",(i+'A'));
	}
	printf("\n");
	for(i=0;i<n;i++){
		printf("P%d:\t",i);
		for(j=0;j<m;j++){
			printf("%d\t",max[i][j]);
		}
		printf("\n");
	}
*/
	printf("输入每个进程已分配的各类资源数,按照%d×%d矩阵输入:\n",n,m);
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&allocation[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			allocation1[i][j] = allocation[i][j];
		}
	}
/*	//输出已分配进程资源数
	printf("allocation:\n\t");
	for(i=0;i<m;i++){
		printf("%c\t",(i+'A'));
	}
	printf("\n");
	for(i=0;i<n;i++){
		printf("P%d:\t",i);
		for(j=0;j<m;j++){
			printf("%d\t",allocation[i][j]);
		}
		printf("\n");
	}*/

	printf("请输入各类资源现有的数目:\n");
	for(i=0;i<m;i++)
		scanf("%d",&available[i]);
	for(i=0;i<m;i++)
		available1[i] = available[i];
/*	//输出可利用资源数
	printf("available:\n");
	for(i=0;i<m;i++){
		printf("%c\t",(i+'A'));
	}
	printf("\n");
	for(i=0;i<m;i++)
		printf("%d\t",available[i]);
	printf("\n");*/
	//计算仍需资源数
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			need[i][j] = max[i][j] - allocation[i][j];
		}
	}

	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			need1[i][j] = need[i][j];
		}
	}
/*
	//输出仍需资源数
	printf("need:\n\t");
	for(i=0;i<m;i++){
		printf("%c\t",(i+'A'));
	}
	printf("\n");
	for(i=0;i<n;i++){
		printf("P%d:\t",i);
		for(j=0;j<m;j++){
			printf("%d\t",need[i][j]);
		}
		printf("\n");
	}
*/
	if(safe()){
		printf("该系统处于安全状态。\n");
		printf("系统安全序列为:");
		for(i=0;i<num;i++){
			printf("P%d\t",sequence[i]);
		}
		num=0;
		printf("\n");
	}else{
		num=0;
		printf("该系统处于不安全状态。\n");
	}


	//请求资源
	do{

		printf("输入要申请的资源进程号:(第一个进程号为0,第二个进程号为1,依此类推):\n");
		scanf("%d",&progressNum);
		printf("输入进程所请求的各个资源的数量:");
		for(j=0;j<m;j++){
			scanf("%d",&requst[j]);
		}
		if(testRequst()){
			
			for(j=0;j<m;j++){
				available1[j] = available1[j] - requst[j];
				allocation1[progressNum][j] = allocation1[progressNum][j] + requst[j];
				need1[progressNum][j] = need[progressNum][j] -	requst[j];
			}
			if(safe()){
				printf("该系统处于安全状态。\n");
				printf("系统安全序列为:");
				for(i=0;i<num;i++){
					printf("P%d\t",sequence[i]);
				}
				num=0;
				printf("\n同意请求分配。\n");
				for(i=0;i<n;i++){
					for(j=0;j<m;j++){
						allocation[i][j] = allocation1[i][j];
					}
					
				}
				for(i=0;i<m;i++)
					available[i] = available1[i];
				for(i=0;i<n;i++){
					for(j=0;j<m;j++){
						need[i][j] = need1[i][j];
					}
				}
				
			}else{
				num=0;
				printf("该系统处于不安全状态。不同意分配。\n");
				for(i=0;i<n;i++){
					for(j=0;j<m;j++){
						allocation1[i][j] = allocation[i][j];
					}
					
				}
				for(i=0;i<m;i++)
					available1[i] = available[i];
				for(i=0;i<n;i++){
					for(j=0;j<m;j++){
						need1[i][j] = need[i][j];
					}
				}
			}
		}else{
			printf("资源不足,请等待。\n");
		
		}
		printf("请求分配y/n:");
		do{
			getchar();
			scanf("%c",&change);
			if(change!='y'||change!='Y'||change!='N'||change!='n')
				printf("输入不合法。请重新输入:\n");
		}while(change!='y'||change!='Y'||change!='N'||change!='n');
	}while(change == 'y'||change == 'Y');
}
发布了12 篇原创文章 · 获赞 7 · 访问量 4698

猜你喜欢

转载自blog.csdn.net/qq_30385099/article/details/100035952
今日推荐