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;
}
样例如下: