标签:
银行家算法(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