处理机调度避免死锁之银行家算法

    Dijkstra的银行家算法是处理机调度问题中很具有代表性的避免死锁的算法。

实现代码如下:

/*
Author:Ibsen
Date:2015.11.14
*/
#include 
#include 
#include 
#include 
using namespace std;
const int M=100; //表示资源的最大种类
const int N=100; //表示进程的最大数目
int available[M]; //可利用资源向量
int work[M]; //工作向量
bool finish[N]; //标记是否足够分配
int maxa[N][M]; //最大需求矩阵
int allocation[N][M]; //分配矩阵
int need[N][M]; //需求矩阵
int req[M]; //请求向量
int m,n; //表示资源和进程的种类
queue que;
void Init()
{
	cout<<"输入最大需求矩阵:"<>maxa[i][j];
	cout<<"输入分配矩阵:"<>allocation[i][j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			need[i][j]=maxa[i][j]-allocation[i][j]; //计算需求矩阵
	cout<<"输入可利用资源:"<>available[i];
}
void display()
{
	cout<<"最大需求矩阵为:"<work[j]) break;
		}
		if(j>m) return true;
	}
	return false;
}
bool Is_safe()
{
	memset(finish,false,sizeof(finish));
	for(int i=1;i<=m;i++)
		work[i]=available[i];
	while(!que.empty()) que.pop();
	while(1)
	{
		int i=1;
		for(;i<=n;i++)
		{
			if(judge(i))
			{
				que.push(i);
				for(int j=1;j<=m;j++)
					work[j]+=allocation[i][j];
                finish[i]=true;
				break;
			}
		}
		if(que.size()==n) return true;
		else if(i>n) return false;
	}
}
void Answer()
{
	cout<<"存在安全序列:";
	while(!que.empty())
	{
		cout<<"P"<need[id][i])
		{
			cout<<"请求失败:请求资源超出最大需求值!"<available[i])
		{
			cout<<"请求失败:请求资源超出可利用资源!"<>m>>n)
	{
		Init(); //初始化
		display();
		if(Is_safe()) Answer();
		else cout<<"不存在安全序列!"<>id)
		{
			for(int i=1;i<=m;i++)
			  cin>>req[i];
		    Req_judge(id);
		}
	}
	return 0;
}


样例如下:

处理机调度避免死锁之银行家算法_第1张图片



处理机调度避免死锁之银行家算法_第2张图片

你可能感兴趣的:(Linux/Unix)