银行家算法 c++ 简要 演示

先推荐一个题目,对于新手可以帮助很快理解银行家算法,本次程序也是以该题数据为基础初始化的。

http://wenku.baidu.com/view/f9d05f5fbe23482fb4da4c08.html

(百度文库上的,下载积分为0)

T0时刻系统状态表:

最大资源需求量

已分配资源数量

A    B    C 

 A    B    C

P1

 5    5    9

 2    1    2

P2

 5    3    6

 4    0    2

P3

 4    0    11

 4    0    5

P4

 4    2    5

 2    0    4

P5

 4    2    4

 3    1    4

资源总量:A 17 B 5 C 20

安全性检测的原则是:

1 进程申请资源可分布申请,但总量不应超过其最大需求量

2 每次申请的资源量必须小于系统可供使用的资源量

3 分配完成后,系统是安全的,即仍存在一个序列,可以运行完当前所有进程,这是关键

笔者写了一个程序可以完整演示整个测试流程,看一下运行结果即可理解银行家算法,代码在vc6下测试完美通过。

附上完整代码与注释:

#include<iostream>
using namespace std;

#define M 5//进程数
#define N 3//资源数

int R[N]={17,5,20};//资源总数
int Maxall[N]={0};//被占用的资源数
int V[N]={0};//可用资源总数

int Max[M][N]={{5,5,9},{5,3,6},{4,0,11},{4,2,5},{4,2,4}};//各进程最大需求量
int Alloc[M][N]={{2,1,2},{4,0,2},{4,0,5},{2,0,4},{3,1,4}};//各进程已经分配的资源量
int Need[M][N]={0};//各进程还需要的资源量
int Appli[M][N]={0};//一次为某个进程申请的资源量

int i,j,n;//程序中用



int main()
{
	void init();
	void show();
	int applicate(int,int,int,int);
	void update(int,int,int,int);
	void release(int,int,int,int);
	int safecheck();
	init();
	show();
	safecheck();//这里安排显示了按安全序列执行完毕前后的系统状态
	show();
	return 0;
}

void init()//初始化状态
{
/*	cout<<"请依次输入各进程对资源最大需求量:"<<endl;
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
		{
			cout<<i<<"进程"<<j<<"资源:"<<endl;
			cin>>Max[i][j];
		}
	cout<<"请依次输入各进程已分配资源:"<<endl;
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
		{
			cout<<i<<"进程"<<j<<"资源:"<<endl;
			cin>>Alloc[i][j];
		}
	cout<<"请依次输入各资源总数:"<<endl;
	for(j=0;j<N;j++)
	{
		cout<<j<<"资源:"<<endl;
		cin>>R[j];
	}
*/
//本可以自行输入的,此处为避免大量输入,在程序中初始化
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
			Need[i][j]=Max[i][j]-Alloc[i][j];

	for(j=0;j<N;j++)
		for(i=0;i<M;i++)
			Maxall[j]+=Alloc[i][j];

	for(j=0;j<N;j++)
		V[j]=R[j]-Maxall[j];
}

void show()//显示系统状态
{
	cout<<"Max:"<<endl;
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
			cout<<Max[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
	cout<<"Alloc:"<<endl;
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
			cout<<Alloc[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
	cout<<"Need:"<<endl;
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
			cout<<Need[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
	cout<<"系统总资源:"<<endl;
	for(n=0;n<N;n++)
		cout<<R[n]<<" ";
	cout<<endl;
	cout<<"系统剩下的资源"<<endl;
	for(j=0;j<N;j++)
	{
		cout<<V[j]<<" ";
	}
	cout<<endl;
}

int applicate(int i,int r1,int r2,int r3)//资源申请
{
	Appli[i][0]=r1;
	Appli[i][1]=r2;
	Appli[i][2]=r3;
	if((Appli[i][0]<=Need[i][0] && Appli[i][1]<=Need[i][1] && Appli[i][2]<=Need[i][2]) && (Appli[i][0]<=V[0] && Appli[i][1]<=V[1] && Appli[i][2]<=V[2]))
	{
//		cout<<"申请成功,但还未进行安全性检测..."<<endl;
		return 1;
	}
	else
	{
//		cout<<"申请失败..."<<endl;
		return 0;
	}
}

void update(int i,int r1,int r2,int r3)//分配资源,注意保证数据的一致性
{
	Alloc[i][0]+=r1; Alloc[i][1]+=r2; Alloc[i][2]+=r3;
	Need[i][0]-=r1;  Need[i][1]-=r2;  Need[i][2]-=r3;
	V[0]-=r1;        V[1]-=r2;        V[2]-=r3;
}

void release(int i,int r1,int r2,int r3)//释放资源,注意保证数据的一致性
{
	Alloc[i][0]-=r1; Alloc[i][1]-=r2; Alloc[i][2]-=r3;
	Need[i][0]+=r1;  Need[i][1]+=r2;  Need[i][2]+=r3;
	V[0]+=r1;        V[1]+=r2;        V[2]+=r3;
}

int safecheck()//检测安全性,反复M次寻找一个可执行的进程,执行完后释放资源,再往复下一步
{
	int count=0;
	cout<<endl<<endl;
	cout<<"开始安全性测试:(此测试将改动数据,即执行完整个进程,正式的检测应有备份数据,此处只演示检测过程,为节省篇幅省略)"<<endl;
	while(count<5)
	{
		for(int m=0;m<M;m++)
		{
			if(applicate(m,Need[m][0],Need[m][1],Need[m][2]) )
			{
				if(((Alloc[m][0]==0)&&(Alloc[m][1]==0)&&(Alloc[m][2]==0)))
					continue;
				update(m,Need[m][0],Need[m][1],Need[m][2]);
				release(m,Alloc[m][0],Alloc[m][1],Alloc[m][2]);
				cout<<"进程"<<m<<"顺利结束"<<endl;
				count++;
				show();//这样你可以观察到每一个细致的变化
				break;
			}
		}
	}
	cout<<"至此队列执行结束!"<<endl<<endl<<endl;
	return 1;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值