操作系统: 银行家算法的分析和代码实现(c++语言)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。


1)各种资源总数向量resource
是一个含有m个元素的数组,其中的每一个元素代表一类系统可提供的的资源数目总数。如果resource[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Claim
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Claim[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。
4)还可使用的资源数available向量
这是一个含有m个元素的数组,每个元素代表一类资源还能够使用的数目。


算法的执行流程很简单:
(1)先用resource[i]-sum[i](各个进程占用某个资源的总数)求出available[i]数组
(2)然后遍历n*m的矩阵,只要有一个进程对各类资源的需求均小于available数组,就将其认为是安全的,并且结束后将其占用的资源释放,即available[j]+=alloc[i][j];

(3)相反,在上一个步骤中,如果找不到这样的一个序列,我们就认为是不安全序列,不允许分配,程序结束。

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
#define M 4
#define N 3
int resource[M];
int available[M];
int claim[N][M];
int alloc[N][M];
int vis[N];
vector<int> ans;
int main()
{
	cout<<"请输入每个进程对资源的最大值矩阵"<<endl;
	for(int i=0;i<N;i++)
		for(int j=0;j<M;j++)
			cin>>claim[i][j];
	cout<<"请输入每个进程已经分配的各个资源"<<endl;
	for(int i=0;i<N;i++)
		for(int j=0;j<M;j++)
			cin>>alloc[i][j];
	cout<<"请输入各个资源的总数"<<endl;
	for(int i=0;i<M;i++)
		cin>>resource[i];

	int sum[M];
	memset(sum,0,sizeof(sum)); 
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<M;j++)
			sum[j]+=alloc[i][j];
	}
	for(int i=0;i<M;i++)
	available[i]=resource[i]-sum[i];
	
	memset(vis,0,sizeof(vis));
	ans.clear();
	int is_ok=0;
	while(1)
	{
		if(ans.size()==N)
		{
			is_ok=1;
			break;
		}

		int index;
		int flag=0;
		for(int i=0;i<N;i++)
		{
			int judge=1;
			if(!vis[i])
			{
			  for(int j=0;j<M;j++)
			  {
				 if(available[j]<claim[i][j]-alloc[i][j])
				 {
					 judge=0;
					 break;
				 }
			 }
			}
			else
				continue;

			if(judge)
			{
				index=i;
				flag=1;
				break;

			}

		}
		   if(flag)
          {
		       vis[index]=1;
	           ans.push_back(index);
		       for(int k=0;k<M;k++)
		       available[k]+=alloc[index][k];
		  }
   	      else
		  {
				cout<<"出现死锁,无法分配!"<<endl;
				return 0;
		  }

	}
	if(is_ok)
	{
		cout<<"不会发生死锁,安全序列是:"<<endl;
		for(int i=0;i<ans.size();i++)
			cout<<ans[i]<<"  ";
		cout<<endl;
	}
	return 0;
}


你可能感兴趣的:(C++,操作系统,代码实现,银行家算法)