标签:
银行家算法(Banker‘s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
(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;
}标签:
原文地址:http://blog.csdn.net/nk_test/article/details/50269959