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

📄 dijkstra.c

📁 银行家算法 1. 实验目的: 用高级语言编写和调试一个利用银行家算法避免死锁的程序
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N  5
#define M  3
int p[N];
int Available[M];           //可使用资源向量
int Max[N][M];             //最大需求矩阵
int Allocation[N][M];      //分配矩阵
int Need[N][M];           //需求矩阵
int Work[N];                //工作向量
int Finish[N];              //状态标志
int Request[N][M];         //进程申请资源向量

//读入最大需求矩阵
void readMax ()
{
	int i;
	FILE *fp ;	//读文件
	if( (fp=fopen("bao1.txt","r")) == NULL ) {
		printf("文件不存在\n") ;
	}
	else
	{
		printf("最大需求矩阵\n");
		printf("进程\t资源A\t资源B\t资源C\n");
		for(i=0; i<N; i++)
		{
			fscanf(fp,"%d %d %d\n",&Max[i][0],&Max[i][1],&Max[i][2]) ;
			printf("%d\t%d\t%d\t%d\n",i,Max[i][0],Max[i][1],Max[i][2]) ;
		}
	}
}

//读入分配矩阵
void readAllocation()
{
	int i;
	FILE *fp ;	//读文件
	if( (fp=fopen("bao2.txt","r")) == NULL ) {
		printf("文件不存在\n") ;
	}
	else
	{
		printf("分配矩阵\n");
		printf("进程\t资源A\t资源B\t资源C\n");
		for(i=0; i<N; i++)
		{
			fscanf(fp,"%d %d %d\n",&Allocation[i][0],&Allocation[i][1],&Allocation[i][2]) ;
			printf("%d\t%d\t%d\t%d\n",i,Allocation[i][0],Allocation[i][1],Allocation[i][2]) ;
		}
	}
}

//判断函数
int just(int a,int b,int c,int d,int e,int f)
{
		if((a<=d)&&(b<=e)&&(c<=f))return 1;
		else return 0;
}

int safecheck()//安全检查算法
{
	int i;
	int j;
	int k=0;
	for(i=0;i<N;i++)
	Finish[i]=0;
	for(i=0;i<M;i++)
		Work[i]=Available[i];
	for(j=0;j<N;j++)
	for(i=0;i<N;i++)
	{
		if(Finish[i]==0&&just(Need[i][0],Need[i][1],Need[i][2],Work[0],Work[1],Work[2]))
		{
			for(j=0;j<M;j++)
			{
				Work[j]=Work[j]+Allocation[i][j];
				Finish[i]=1;
			}
			p[k]=i;
			k++;break;
		}
	}
	for(i=0,j=0;i<N;i++)
	{
		if(Finish[i]==0)j++;
	}
	if(j==0)return 1;
	else return 0;
}

//银行家算法
void process()
{
	int i;
	int j;
	int m;
	int n;
	int l;
	int a[3]={10,5,7};//定义3类资源总数
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
		{
			a[i]=a[i]-Allocation[j][i];
			Available[i]=a[i];
		}
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)
		{
			Max[i][j]=Max[i][j]-Allocation[i][j];
			Need[i][j]=Max[i][j];
		}
	printf("共有5个进程0,1,2,3,4\n");
	do{
		printf("请输入进程名\n");
		scanf("%d",&m);
		printf("请输入请求的资源数\n");
		scanf("%d %d %d",&Request[m][0],&Request[m][1],&Request[m][2]);
		if(!just(Request[m][0],Request[m][1],Request[m][2],Need[m][0],Need[m][1],Need[m][2]))
		{
			printf("进程申请的资源数多于它自己申报的最大量\n");
		}
		else 
		{
			if(!just(Request[m][0],Request[m][1],Request[m][2],Available[0],Available[1],Available[2]))
			printf("无足够资源\n");
			else 
			{
				for(n=0;n<M;n++)
				{//试探性分配
					Available[n]=Available[n]-Request[m][n];
					Allocation[m][n]=Allocation[m][n]+Request[m][n];
					Need[m][n]=Need[m][n]-Request[m][n];
				}	
				i=safecheck();
				if(i==0)
				{
					printf("系统处于不安全状态\n");
					for(n=0;n<M;n++)
					{//恢复原来的资源分配状态
						Available[n]=Available[n]+Request[m][n];
						Allocation[m][n]=Allocation[m][n]-Request[m][n];
						Need[m][n]=Need[m][n]+Request[m][n];
					}	
				}
				else
				{
					printf("系统处于安全状态\n");
					printf("得到安全序列:");
					for(i=0;i<N;i++)
					printf("%d ",p[i]);
					printf("\n");
				}
			}
		}
		printf("是否继续申请资源 是按0 否按其他键结束\n");
		scanf("%d",&l);
	}
	while(l==0);
}

void main()
{
	readMax ();
	readAllocation();
	process();
}

⌨️ 快捷键说明

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