用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

银行家算法

2012-10-13 作者:feng举报

[c++]代码库

#include<iostream>
using namespace std;
int avaResour[3]={3,3,2};
int allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int maxRequest[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int nneed[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
void rrequest();
bool safeTest();

int main()
{
	rrequest();
	return 0;
}

void rrequest()
{
	int sqjc=0,i=0,l=0,a=0,b=0,c=0;
	char contn=0;
	cout<<endl<<"进程个数:5   资源个数:3"<<endl<<"可用资源向量Available:"<<endl;
	for(i=0;i<3;i++)
		cout<<avaResour[i]<<"       ";
	cout<<endl<<"最大需求矩阵Max:"<<endl;
	for(i=0;i<5;i++)
	{
		for(l=0;l<3;l++)
			cout<<maxRequest[i][l]<<"       ";
		cout<<endl;
	}
	cout<<"已分配矩阵Allocation:"<<endl;
	for(i=0;i<5;i++)
	{
		for(l=0;l<3;l++)
			cout<<allocation[i][l]<<"       ";
		cout<<endl;
	}
	cout<<"需求矩阵Need:"<<endl;
	for(i=0;i<5;i++)
	{
		for(l=0;l<3;l++)
			cout<<nneed[i][l]<<"       ";
		cout<<endl;
	}
	cout<<"输入发起请求的进程(0-4): ";
	cin>>sqjc;
	while(sqjc>4||sqjc<0)
	{
		cout<<endl<<"不要乱输! ^_^"<<endl;
		cout<<endl<<"输入发起请求的进程(0-4): ";
		cin>>sqjc;
	}
	cout<<"输入请求资源的数目,按照这样的格式输入 x x x: ";
	cin>>a>>b>>c;
	if(a<=nneed[sqjc][0] && b<=nneed[sqjc][1] && c<=nneed[sqjc][2])
	{
		cout<<endl<<"开始执行银行家算法..."<<endl;
		if(a<=avaResour[0] && b<=avaResour[1] && c<=avaResour[2])
		{
			avaResour[0]=avaResour[0]-a; avaResour[1]=avaResour[1]-b; 
			avaResour[2]=avaResour[2]-c;
			allocation[sqjc][0]=allocation[sqjc][0]+a;
			allocation[sqjc][1]=allocation[sqjc][1]+b;
			allocation[sqjc][2]=allocation[sqjc][2]+c;
			nneed[sqjc][0]=nneed[sqjc][0]-a;
			nneed[sqjc][1]=nneed[sqjc][1]-b;
			nneed[sqjc][2]=nneed[sqjc][2]-c;
			cout<<endl<<"试分配完成..."<<endl; 
			if(safeTest())
			{
				cout<<endl<<"开始给第"<<sqjc<<"个进程分配资源..."<<endl
					<<"分配完成,已更新Allocation_list.txt"<<endl;
				for(i=0;i<5;i++)
					if(nneed[i][0]==0 && nneed[i][1]==0 && nneed[i][2]==0)
						for(l=0;l<3;l++)
						{
							avaResour[l]=avaResour[l]+allocation[i][l];
							allocation[i][l]=0;
						}
			}							
			else
			{
				cout<<endl<<"系统已恢复试分配前状态。"<<endl;
				avaResour[0]=avaResour[0]+a; avaResour[1]=avaResour[1]+b;
				avaResour[2]=avaResour[2]+c;
				allocation[sqjc][0]=allocation[sqjc][0]-a;
				allocation[sqjc][1]=allocation[sqjc][1]-b;
				allocation[sqjc][2]=allocation[sqjc][2]-c;
				nneed[sqjc][0]=nneed[sqjc][0]+a;
				nneed[sqjc][1]=nneed[sqjc][1]+b;
				nneed[sqjc][2]=nneed[sqjc][2]+c;		
			}
		}
		else
  			cout<<endl<<"试分配失败,系统无足够资源"<<endl;
	}
	else
 		cout<<endl<<"Error!申请的资源大于需求值"<<endl;
	xz:
	cout<<"\n\n"<<"要继续吗?(y-继续;n-终止):";
	cin>>contn;	
	switch(contn)
	{
	 	case 'y':rrequest();
	 	case 'n':break;
	 	default:cout<<"亲,不要乱输哦"<<endl;
	 			goto xz;break;
	}
}

bool safeTest()
{
	int s=0,m=0,z=0,r[5]={0},y=0,wwork[3]={0};
	bool ffinish[5]={0};
	cout<<endl<<"进入安全性测试!"<<endl;
	for(s=0;s<3;s++)
		wwork[s]=avaResour[s];
	for(z=0;z<5;z++)
	{
		for(s=0;s<5;s++)
			if(ffinish[s]==0 && nneed[s][0]<=wwork[0] && nneed[s][1]<=wwork[1]
				&& nneed[s][2]<=wwork[2])
   			{
   				for(m=0;m<3;m++)
   					wwork[m]=wwork[m]+allocation[s][m];
				ffinish[s]=1;
				r[y]=s;
				y++;
			}
	}
	if(y==5)
	{
		cout<<endl<<"找到一个安全序列:";
		for(s=0;s<2;s++)
			cout<<"P"<<r[2*s]<<"--->"<<"P"<<r[2*s+1]<<"--->";
		cout<<"P"<<r[4]<<endl<<"已通过安全检测!"<<endl;
		return 1;
	}
	cout<<endl<<"没有找到安全序列!"<<endl<<"安全测试失败。"<<endl;
	return 0;
}



分享到:
更多

网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。