银行家算法

1 设计内容 
完成银行家算法的模拟实现:设计有m个进程共享n个系统资源的系统,进程可动态的申请和释放资源。系统按各进程的申请动态的分配资源时,采用银行家算法有效地避免死锁的发生。
2 算法原理
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。每分配一次资源就测试一次是否安全,不是资源全部就位后才测试,注意理解checkError函数的循环顺序。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
1、当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客(试探性分配) 顾客可以分期贷款,但贷款的总数不能超过最大需求量(可能一次并不能满足所需要的全部资源) 。
2、当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款(不存在死锁) 。
3、当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金(运行后释放) 。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能存在安全状态,则按当前的申请量分配资源,否则也要推迟分配。

3 关键代码

void Bank()
{

	char t;
	cout<<"是否请求资源?请输入你的选择:Y 或 N:";
	cin>>t;
	if(t=='N')
	{
		cout<<"------------------END!!!!!--------------------"<<endl;
	}
	if(t=='Y')
	{
		
		cout<<"请输入需要请求资源的进程:";
		cin>>process_num;
		cout<<"请输入进程"<<process_num<<"的资源请求量:";
		for(int j=0;j<n;j++)
		{
			cin>>request[j];
		}

		process_num=process_num-1;//因为数组序号从0开始

		int compare1=1;//-------------------------1
		for(int k=0;k<n;k++)
		{
			if(request[k]>need[process_num][k])
				compare1=0;
		}

		if(compare1)
		{
			int compare2=1;//---------------------2
			for(int kk=0;kk<n;kk++)
			{
				if(request[kk]>available[kk])
					compare2=0;
			}

			if(compare2)
			{
				for(int o=0;o<n;o++)
				{
					available[o]=available[o]-request[o];
				}
				for(int p=0;p<n;p++)
				{
					allocation[process_num][p]=allocation[process_num][p]+request[p];
				}
				for(int q=0;q<n;q++)
				{
					need[process_num][q]=need[process_num][q]-request[q];
				}

count++;//记录第几次申请资源
				security();
			}

/*----------------compare2=0------------------*/
			else
		{
			cout<<"请求资源不当!";
			Bank();
		}

		}
/*----------------compare1=0------------------*/
		else
		{
			cout<<"请求资源不当!";
			Bank();
		}
	}	
}

/*---------------------------------------------------------------------------------*/

void security()
{  
	int sum[20];
	int x=0;

	for(int ii=0;ii<n;ii++)
		work[ii]=available[ii];

    for(int jj=0;jj<m;jj++)
		finish[jj]=0;

	for(int a=0;a<m;a++)
		for(int j=0;j<m;j++)
		{
			int flag=1;
			for(int b=0;b<n;b++)
			{
				if(work[b]<need[j][b])
					flag=0;
			}
			if(flag)
			{
				sum[x++]=j;
               
				for(int c=0;c<n;c++)
				{
					work[c]=work[c]+allocation[j][c];
					finish[j]=1;
				}
			}
		}
		int safe=1;
		for(int d=0;d<m;d++)
		{
				
			if(finish[d]==0)
			{			
				cout<<"无安全序列!系统处于不安全状态!"<<endl;
				safe=0;
			   
				break;
			}
		}
		if(safe)
		{
			cout<<"系统处于安全状态!"<<endl;
				cout<<"找到一个安全序列:";
			for(int e=0;e<m-1;e++)
			{
				cout<<sum[e]+1<<"->";
			}
			cout<<sum[m-1]+1<<endl;
			Bank();
		}
		if((safe==0)&&(count==0))
		{
			cout<<"------请重新输入!-------"<<endl;
			input();
		}
		else if((safe==0)&&(count>=1))
		{


			cout<<"撤销资源申请!"<<endl;
			/***************撤销资源申请***************/
			
					for(int o=0;o<n;o++)
				{
					available[o]=available[o]+request[o];
				}
				for(int p=0;p<n;p++)
				{
					allocation[process_num][p]=allocation[process_num][p]-request[p];
				}
				for(int q=0;q<n;q++)
				{
					need[process_num][q]=need[process_num][q]+request[q];
				}
				Bank();
		}
}
void input()
{
	cout<<"请输入进程数目m:";
	cin>>m;
	cout<<"请输入资源种类数n:";
	cin>>n;

	cout<<"请输入系统可用资源数:";/*************************/
	for(int k=0;k<n;k++)
	{
		cin>>available[k];
	}


	cout<<"请输入最大需求量矩阵:"<<endl;
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			cin>>Max[i][j];
		}


		cout<<"请输入已分配资源数量矩阵:"<<endl;
		for(int c=0;c<m;c++)
			for(int j=0;j<n;j++)
				cin>>allocation[c][j];


		for(int a=0;a<m;a++)
			for(int j=0;j<n;j++)
			{
				need[a][j]=Max[a][j]-allocation[a][j];
			}
}

### 回答1: 首先,银行家算法是用于避免死锁的一种资源分配算法。这个算法需要追踪每个进程系统资源的最大需求、已分配资源和尚需资源。根据这些信息,它可以判断是否可以安全地分配资源,从而避免死锁。 设计一个能实现银行家算法的程序,可以按照以下步骤: 1) 定义n个并发进程,并设置它们对m个系统资源的最大需求和已分配资源。 2) 初始化一个长度为m的资源向量,表示系统中每个资源的可用数量。 3) 遍历每个进程,判断其最大需求和已分配资源是否小于等于资源向量中对应资源的可用数量。如果是,则将进程标记为安全状态。 4) 在安全状态下,模拟分配资源给进程。首先,将进程所需的资源从资源向量中减去,然后将资源分配给进程。同时,更新进程的已分配资源和尚需资源。 5) 重复步骤3和4直到所有的进程都被标记为安全状态,或者没有足够的资源来满足进程的需求。 6) 如果存在未被标记为安全状态的进程,说明系统处于不安全状态。在这种情况下,应该回滚分配的资源,恢复它们到资源向量中。 这个程序可以使用任何合适的编程语言来实现。它需要能够进行并发处理和资源分配的功能。同时,确保在分配资源时遵循银行家算法的原则,以避免死锁的发生。 ### 回答2: 要设计一个能实现银行家算法的程序,需要满足以下要求: 1) 有n个并发进程和m个系统资源。 2) 程序的最简单选择方式是通过循环来分配资源给进程。 3) 首先,需要创建n个进程,每个进程都需要声明它所需要的资源数量(maximum)和实际已分配资源数量(allocated)。 4) 然后,通过循环为每个进程分配资源。在每次循环中,检查每个进程的最大需求量是否大于已分配资源的数量,如果是,则继续为该进程分配资源。 5) 为了保证系统的安全性,还需要引入一个availabe向量,用于记录系统中剩余的可用资源数量。 6) 当为一个进程分配资源时,需要检查是否会导致系统处于不安全状态。如果为一个进程分配资源后,存在一个安全序列,那么就进行资源分配,并更新availabe向量和allocated矩阵。 7) 如果无法找到安全序列,则暂停资源分配,直到系统再次处于安全状态。 总之,设计一个n个并发进程共享m个系统资源的程序,以实现银行家算法,需要通过循环来分配资源给进程,并根据安全性条件检查是否可以分配资源。该程序的最简单选择方式是每次循环中为一个进程分配资源,并在每次分配后更新availabe向量和allocated矩阵。 ### 回答3: 银行家算法是一种用于确保并发程序安全执行的算法,它可以防止死锁的发生。在设计一个n个并发进程共享m个系统资源的程序以实现银行家算法时,可以按照以下步骤进行简单选择: 1. 初始化:首先,我们需要初始化各个进程的资源需求和可用资源数。每个进程i都有一个资源需求向量Need[i],其表示进程i还需要获取的每种资源数量,还有一个资源分配向量Allocation[i],其表示当前进程i已经被分配的每种资源数量,还有一个资源可用向量Available,其表示当前系统中每种资源的可用数量。 2. 安全性检查:接下来,我们需要进行安全性检查,以确保系统可以安全执行并没有发生死锁。安全性检查可以使用银行家算法进行,具体步骤如下: - 遍历每个进程i,检查其资源需求向量Need[i]是否小于等于资源可用向量Available。 - 如果满足条件,将进程i的资源分配向量Allocation[i]添加到资源可用向量Available中,并标记进程i为完成状态(即进程i不再需要任何资源)。 - 重复以上两步,直到所有进程都被标记为完成状态或没有进程满足条件。 - 如果存在安全序列,即所有进程都能够顺利执行并完成,那么系统是安全的。否则,系统是不安全的。 3. 资源分配:在安全性检查通过后,我们可以进行资源分配。具体步骤如下: - 遍历每个进程i,检查其资源需求向量Need[i]是否小于等于资源可用向量Available。 - 如果满足条件,将进程i的资源分配向量Allocation[i]添加到资源可用向量Available中,并将进程i标记为完成状态。 - 重复以上两步,直到所有进程都被标记为完成状态或没有进程满足条件。 通过上述简单选择的设计,我们可以实现银行家算法,确保系统并发执行时不会发生死锁,并能正确地进行资源分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值