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

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

实现代码如下:

/*
Author:Ibsen
Date:2015.11.14
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
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 <int>que;
void Init()
{
	cout<<"输入最大需求矩阵:"<<endl;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>maxa[i][j];
	cout<<"输入分配矩阵:"<<endl;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>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<<"输入可利用资源:"<<endl;
	for(int i=1;i<=m;i++)
		cin>>available[i];
}
void display()
{
	cout<<"最大需求矩阵为:"<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<maxa[i][j]<<" ";
		cout<<endl;
	}
	cout<<"分配矩阵为:"<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<allocation[i][j]<<" ";
		cout<<endl;
	}
	cout<<"需求矩阵为:"<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<need[i][j]<<" ";
		cout<<endl;
	}
	cout<<"可利用资源向量为:";
	for(int i=1;i<=m;i++)
		cout<<available[i]<<" ";
	cout<<endl;
}
bool judge(int i)
{
	if(!finish[i])
	{
		int j=1;
		for(;j<=m;j++)
	    {
			if(need[i][j]>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"<<que.front()<<" ";
		que.pop();
	}
	cout<<endl;
}
void Req_judge(int id)
{
	for(int i=1;i<=m;i++)
	{
		if(req[i]>need[id][i])
		{
			cout<<"请求失败:请求资源超出最大需求值!"<<endl;
			return ;
		}
		if(req[i]>available[i])
		{
			cout<<"请求失败:请求资源超出可利用资源!"<<endl;
			return ;
		}
	}
	for(int i=1;i<=m;i++)
	{
		available[i]-=req[i];
		allocation[id][i]+=req[i];
		need[id][i]-=req[i];
	}
	if(Is_safe())
	{
		cout<<"请求成功!"<<endl;
		Answer();
	}
	else
	{
		cout<<"请求失败:不存在安全序列!"<<endl;
	}
	for(int i=1;i<=m;i++)
	{
		available[i]+=req[i];
		allocation[id][i]-=req[i];
		need[id][i]+=req[i];
	}
}
int main()
{
	while(cin>>m>>n)
	{
		Init(); //初始化
		display();
		if(Is_safe()) Answer();
		else cout<<"不存在安全序列!"<<endl;
		int id;
		cout<<"输入进程请求(输入格式:进程编号 请求向量):"<<endl;
		while(cin>>id)
		{
			for(int i=1;i<=m;i++)
			  cin>>req[i];
		    Req_judge(id);
		}
	}
	return 0;
}


样例如下:





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值