操作系统之银行家算法代码实现

本文介绍了一个基于银行家算法的资源分配程序,通过C语言实现,包括资源请求、分配、安全检查等功能,有效防止了系统死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个实验代码较为简单 不多说 直接上代码

#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct    
 {
    int A;
	int B;
	int C;
 }Resource;
Resource Max[N]={{7,5,3},
				 {3,2,2},
				 {9,0,2},
			     {2,2,2},
				 {4,3,3}};   
Resource Allo[N]={{0,1,0},
				  {2,0,0},
				  {3,0,2},
				  {2,1,1},
			      {0,0,2}};
Resource Need[N]={{7,4,3},
				  {1,2,2},
				  {6,0,0},
				  {0,1,1},
			      {4,3,1}};
Resource Available={3,3,2};
Resource Work[N]={0};
int Finish[N];//是否可以分配资源 
int Safesequence[N]={0};//存入安全序列 
void Initial();	//初始化
void Input();//输入
void PrintTable();	//输出资源分配表
int request(int process,Resource app);//请求资源
void tryDistribute(int process,Resource app);//试探分配
void Rollback(int process,Resource app);//安全检查失败,回滚
int Safecheck();//安全检查
int request(int process,Resource app);
void requestResult();
void printresult();

int main()
{
	int flag;
	while(1)
	{
	printf("\n\n\t银行家算法\n\n");
    printf("\t1.初始化\n");
    printf("\t2.查看当前资源分配表\n");
    printf("\t3.请求资源\n");
    printf("\t4.退出\n\n\n");
    printf("\t请输入选择:");
    scanf("%d",&flag);
		switch(flag)
		{
		case 1 : Input(); break;
		case 2 : PrintTable(); break;
		case 3 : requestResult(); break;
		case 4 : exit(0); break;
		default : break;
		}
	}
	return 0; 
} 
void Initial()  //初始化 
{
	for (int i=0;i<N;i++)
	{
		Resource Max[N]={0};
		Resource Allo[N]={0};
		Resource Need[N]={0};
		Resource Available={0};
	}
}
void Input()
{
	system("cls");
	Initial();
	for(int i=0;i<N;i++)
	{
		printf("输入进程P%d的资源分配情况(三类资源,空格隔开)\n",i);
		printf("Max:");
		scanf("%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);
		printf("Alloction:");
		scanf("%d%d%d",&Allo[i].A,&Allo[i].B,&Allo[i].C);
		Need[i].A=Max[i].A-Allo[i].A; 
		Need[i].B=Max[i].A-Allo[i].B; 
		Need[i].C=Max[i].A-Allo[i].C; 
	}
	printf("输入当前可用资源数量(三类资源,空格隔开)\n");
	scanf("%d%d%d",&Available.A,&Available.B,&Available.C);
	system("pause");
	system("cls");
}  
void PrintTable()	//输出资源分配表
{
	system("cls");
	printf("\n\n");
	printf("Process   Max                 Allo                  Need              Available\n");
	printf("          A    B    C|        A    B    C|          A    B    C|      A    B    C|\n");
	printf("  P0      %d    %d    %-1d|        %d    %d    %-1d|          %d    %d    %-1d|      %d    %d    %-1d|\n",Max[0].A,Max[0].B,Max[0].C,Allo[0].A,Allo[0].B,Allo[0].C,Need[0].A,Need[0].B,Need[0].C,Available.A,Available.B,Available.C);
	printf("  P1      %d    %d    %-1d|        %d    %d    %-1d|          %d    %d    %-1d|\n",Max[1].A,Max[1].B,Max[1].C,Allo[1].A,Allo[1].B,Allo[1].C,Need[1].A,Need[1].B,Need[1].C);
	printf("  P2      %d    %d    %-1d|        %d    %d    %-1d|          %d    %d    %-1d|\n",Max[2].A,Max[2].B,Max[2].C,Allo[2].A,Allo[2].B,Allo[2].C,Need[2].A,Need[2].B,Need[2].C);
	printf("  P3      %d    %d    %-1d|        %d    %d    %-1d|          %d    %d    %-1d|\n",Max[3].A,Max[3].B,Max[3].C,Allo[3].A,Allo[3].B,Allo[3].C,Need[3].A,Need[3].B,Need[3].C);
	printf("  P4      %d    %d    %-1d|        %d    %d    %-1d|          %d    %d    %-1d|\n",Max[4].A,Max[4].B,Max[4].C,Allo[4].A,Allo[4].B,Allo[4].C,Need[4].A,Need[4].B,Need[4].C);
	printf("\n");
	system("pause"); 
	system("cls");
}
//试探分配
void  tryDistribute(int process,Resource res)
{
	Available.A=Available.A-res.A;
	Available.B=Available.B-res.B;
	Available.C=Available.C-res.C;
	
	Allo[process].A=Allo[process].A+res.A;
	Allo[process].B=Allo[process].B+res.B;
	Allo[process].C=Allo[process].C+res.C;

	Need[process].A=Need[process].A-res.A;
	Need[process].B=Need[process].B-res.B;
	Need[process].C=Need[process].C-res.C;
}
 //不满足分配条件 再加回去
void  Rollback(int process,Resource res)
{
	Available.A=Available.A+res.A;
	Available.B=Available.B+res.B;
	Available.C=Available.C+res.C;
	
	Allo[process].A=Allo[process].A-res.A;
	Allo[process].B=Allo[process].B-res.B;
	Allo[process].C=Allo[process].C-res.C;

	Need[process].A=Need[process].A+res.A;
	Need[process].B=Need[process].B+res.B;
	Need[process].C=Need[process].C+res.C;
}
int Safecheck()
{
	int s=0; //存储Work[]
	Work[s]=Available;
	int j=0; //存储安全序列 
	int n=0;
	for(int i=0;i<N;i++)//重置finish 
	{
		Finish[i]=0;
	}
	while(n<5)
	{
		for(int i=0;i<N;i++)
		{
			if(Finish[i]==0)
			{			
				if(Need[i].A<=Work[s].A&&Need[i].B<=Work[s].B&&Need[i].C<=Work[s].C)
				{	
					int m=s+1;
					Work[m].A=Work[s].A+Allo[i].A;				
					Work[m].B=Work[s].B+Allo[i].B;			
					Work[m].C=Work[s].C+Allo[i].C;
					Finish[i]=1;		
					Safesequence[j++]=i;
					s=m;					
				}	
			}
		}
		n++;	
	}
	//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态
	for ( int i=0;i<N;i++)
	{
		if (Finish[i]==0)
		{
			return 0;
		}
		else
		{
			Finish[i]=1; 
		} 
	}
	return 1;
}
//资源分配请求
int request(int process,Resource res)
{
	
	if(res.A<=Need[process].A&&res.B<=Need[process].B&&res.C<=Need[process].C)
	{
		
		if(res.A<=Available.A&&res.B<=Available.B&&res.C<=Available.C)
		{
			
			tryDistribute(process,res);
			
			if(Safecheck()==1)
			{
				return 1;
			}
			else
			{
				printf("安全性检查失败。原因:系统将进入不安全状态,可能引起死锁。\n");
				printf("正在回滚...\n");
				Rollback(process,res);
			}
		}
		else
		{
			printf("原因:请求向量大于可利用资源向量。P%d请等待\n",process);
		}
	}
	else
	{
		printf("安全性检查失败。原因:请求向量大于需求向量。\n");
	}
	return 0;
}
void requestResult()
{
	Resource res;
	int process;
	system("cls");
	printf("第几个进程:\n");
	scanf("%d",&process);
	printf("请求的资源数目(三类资源,空格分开):\n");
	scanf("%d%d%d",&res.A,&res.B,&res.C);
	if(request(process,res)==1)
	{
//		for(int i=0;i<5;i++)
//		{
//			if(Need[i].A==0&&Need[i].B==0&&Need[i].C==0)
//			{
//				Available.A+=Allo[i].A;
//				Available.B+=Allo[i].B;
//				Available.C+=Allo[i].C;
//			}
//		 } 
		printf("请求成功!\n");
		printf("安全序列是{P%d,P%d,P%d,P%d,P%d} \n",Safesequence[0],Safesequence[1],Safesequence[2],Safesequence[3],Safesequence[4]);
		printresult();
	}
	else
	{
		printf("请求失败\n");
	}
	system("pause");
	system("cls");
}
void printresult()
{
	printf("Process\t    Work  \t   Need        \t   Allo\t   \t   Work+Allo\t   Finish\n");
	printf("\t    A    B    C|   A    B    C|\t   A    B    C|\t   A    B    C|\n");
	for(int j=0;j<N;j++){
		int i = Safesequence[j];
			printf(" P%d\t    %d    %d    %-1d|   %d    %d    %-1d|\t   %d    %d    %d|\t   %-2d   %-2d   %-1d|     %d\n",Safesequence[j],Work[j].A,Work[j].B,Work[j].C,Need[i].A,Need[i].B,Need[i].C,Allo[i].A,Allo[i].B,Allo[i].C,Work[j].A+Allo[i].A,Work[j].B+Allo[i].B,Work[j].C+Allo[i].C,Finish[i]);
	}
	
}

如有错误,望大佬指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值