c++实现银行家算法模拟

操作系统实验:银行家算法模拟

要求:编写一个系统动态分配资源的模拟程序,采用银行家算法有效地避免死锁的发生。要求程序能够在进程提出资源申请后判断系统是否处于安全状态,如果安全则打印资源分配表和安全序列;如果不安全则输出不能分配的提示。

代码如下:

#include
#include<stdio.h>
using namespace std;

// 五个进程,四个资源的银行家算法
int Available[4];
int Need[5][4] = {0} ; //进程需要资源数组
int Claim[5][4]; //最大需求数组
int Allocation[5][4]; //当前分配资源数
int Request[4] = {0}; //请求资源数
int finish[5]; //进程是否处于安全状态
int fr[4];

void check() //检测系统T0时刻是否处于安全状态
{

int i,j,x;
int k=0,num=0;
int a;
cout<<"T0时刻的安全序列为:"<<endl;
for(i=0;i<4;i++)   //将可用资源赋值给fr变量 
{
	fr[i]=Available[i];
}
while(num!=5)
{
	for(x=0;x<5;x++)
	{	
 		for(i=0;i<5;i++)
		{
 			for(j=0;j<4;j++)
 			{
 				if(finish[i]==1)  //该进程已经检查匹配过 
 				{
 					break;
				}
				else
				{
 					if(Need[i][j]<=fr[j])
 					{
 						k++; 
					}
					if(j==3&&k!=4)  //循环到第四个资源,没有能满足条件的,将标记去掉。 
					{
						k=0;
					}
					if(j==3&&k==4)  
					{
						a=i;            //找出满足条件的 ,标记出来
						num=num+1;   //找出第一个,直到完成所有匹配为止 
						for(i=0;i<4;i++)
						{
							fr[i]=fr[i]+Allocation[a][i];
							finish[a]=1; 
							k=0;
						}   
						cout<<"P"<<a<<","; 	
					}
				}
			}
		}
	}
	if(num!=5)  //执行完所有进程安全匹配以后,进程均无法满足序列要求的话 
	{
		cout<<"错误!!!"<<endl;
		cout<<"系统资源进程分配在T0时刻不存在一个安全序列,该系统无法执行银行家算法"<<endl;
		num=5; //退出循环 
	}
}

}

void show() //资源分配表
{
cout<<endl;
cout<<"---------------------------------------------------------------------------------------------"<<endl;
cout<<" Allocation Claim Need Available “<<endl;
cout<<”---------------------------------------------------------------------------------------------"<<endl;
cout<<"进程 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 "<<endl;

int i,j;
for(i=0;i<5;i++)
{
	cout<<" P"<<i<<"       ";
	for(j=0;j<4;j++)
	{
		cout<<Allocation[i][j]<<"  ";
	}
	cout<<"          ";
	for(j=0;j<4;j++)
	{
		cout<<Claim[i][j]<<"  ";
	}
	cout<<"      ";
	for(j=0;j<4;j++)
	{
		cout<<Need[i][j]<<"  ";
	}
	cout<<"         "; 
	if(i==0)
	{
		for(j=0;j<4;j++)
		{
			cout<<Available[j]<<"  "; 
		}
	}
	cout<<endl; 
}
cout<<"--------------------------------------------------------------------------------------------"<<endl;

}

void request()
{

int i,j,k;
int N,A,B,D,e;
int C=0;
while(C==0)
{
	N=0,A=0;
	cout<<"输入申请的进程名(用0-4表示P0-P4)"<<endl; 
	cin>>k;
	cout<<"输入P"<<k<<"进程的申请资源数"<<endl;
	for(i=0;i<4;i++)
	{
		cin>>Request[i];
	} 
	for(i=0;i<4;i++)
	{
		if(Need[k][i]<Request[i])  //请求超出剩余完成数目 
		{
			N=1; 
		}
		if(Request[i]>Available[i])  //请求超出系统目前可分配资源数
		{
			A=1;
		}
		if(N==1)
		{
			cout<<"请求超出进程剩余完成数目,已退出"<<endl;
			
			break;
		}
		if(A==1)
		{
			cout<<"请求超出系统目前可分配资源数,已退出"<<endl;
			break; 
		}
	}
	while(N!=1&&A!=1)  //请求暂时没问题的话,执行 
	{
		for(i=0;i<4;i++)
		{
			Available[i]=Available[i] - Request[i]; //执行请求后剩余可分配数目 
			Need[k][i] = Need[k][i] - Request[i];  //执行请求后剩余的完成数目 
		}
		for(i=0;i<4;i++)
		{
			int F=0;
			if(Available[i]<Need[k][i])  //可用资源少于执行进程所需剩余资源数 
			{
				B=1;
			}
			else if(Available[F]==0&&Available[F+1]==0&&Available[F+2]==0&&Available[F+3]==0)  //可用资源用完了 
			{
				B=1;
			}
		}
		if(B==1)
		{
			show(); 
			cout<<"由上表可见,可用资源已经不能满足任何进程的申请,执行该申请会使系统进入不安全状态,不能分配资源"<<endl;
			for(i=0;i<4;i++)
			{
				Available[i]=Available[i] + Request[i]; //将变化的数值还回去 
				Need[k][i] = Need[k][i] + Request[i];  //将变化的数值还回去 
			}
			cout<<endl;
			cout<<endl;
			cout<<"资源分配表如下:"<<endl;
			show(); 
			B=0;
			break;
		}
		else         //资源申请成功 
		{
			for(i=0;i<4;i++)
			{
				if(Need[k][i]==0)
				{
					e++;
				}
				if(i==3&&e!=4)   //进程还没分配完 
				{
					e=0;
					for(i=0;i<4;i++)
					{
						Allocation[k][i]= Allocation[k][i]+ Request[i];
					}
					cout<<"资源申请成功,资源分配表如下:"<<endl; 
					show();
				}
				if(i==3&&e==4)       //进程分配完 
				{
					for(i=0;i<4;i++)
					{
						Available[i]=Available[i]+Allocation[k][i]+Request[i];
					}
					for(i=0;i<4;i++)
					{
						Allocation[k][i]=0;
					}
					e=0;
					cout<<"该进程已完成,该进程分配的资源已释放"<<endl;
					cout<<"资源申请成功,资源分配表如下:"<<endl; 
					show();
				}
				
			}
			cout<<"是否继续? 退出测试输入0,继续测试输入非零字符"<<endl;
			cin>>D;
			if(D==0)
			{
				N=1,C=1;
			}
			else{
				break;
			}
		}
	}
}

}

int main()
{

int i,j;
cout<<"银行家算法模拟"<<endl;
cout<<"输入书本102-103资源分配案例数据(5个进程,4类资源)"<<endl;
cout<<"依次输入五个进程的最大资源需求数" <<endl;
for(i=0;i<5;i++)
{
	for(j=0;j<4;j++)
	{
		
		cin>>Claim[i][j]; 
	}
}
cout<<"输入每个进程每个资源的已分配资源的数目"<<endl;
for(i=0;i<5;i++)
{
	for(j=0;j<4;j++)
	{
		cin>>Allocation[i][j];
		Need[i][j] = Claim[i][j] - Allocation[i][j];
	}
}
cout<<"输入每个资源剩余可用数量"<<endl;
for(i=0;i<4;i++)
{
	cin>>Available[i];
}
check();
cout<<endl;
cout<<endl;
cout<<"当前时刻资源分配表如下";
show();
request(); 
return 0;

}

效果截图:

基本信息录入,显示安全序列
在这里插入图片描述

申请进程,完成以后释放

在这里插入图片描述

资源申请不合理不允许申请
在这里插入图片描述

总结:这个实验还是挺有趣。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值