银行家算法Banker‘s Algorithm(c++简单实现)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了银行家算法Banker‘s Algorithm(c++简单实现),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2711字,纯文字阅读大概需要4分钟。
内容图文
![银行家算法Banker‘s Algorithm(c++简单实现)](/upload/InfoBanner/zyjiaocheng/621/30a0d66f5cd1452a973fc7f38f1a416f.jpg)
死锁问题的避免——银行家算法
银行家算法的数据结构
- 可利用资源向量Available
- 最大需求矩阵Max
- 已分配矩阵Allocation
- 仍然需求矩阵Need
银行家算法
设Requesti 是进程Pi的请求量,如果Requesti[j]=k,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查。
a) 如果Requesti[j] <=Need[I,j],便转向步骤(b);否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。
b) 如果Requesi[j] <=Available[j],便转向步骤(c);否则,表示尚无足够的资源,Pi须等待。
c) 系统试探着把资源分配给进程Pi,并修改下面的数据结构中的数值:
Available[j] := Available[j] – Request i[j];
Allocation[i, j] :=Allocation[i, j] + Request i[j];
Need[i, j] := Need[i, j] – Request i[j];
d) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,已完成本次资源的分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
安全算法
(1) 设置两个向量:
① 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work :=Available。
② Finish,他表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish := false;当有足够资源分配给进程时,再令Finish[i] :=true。
(2) 从进程集合中找到一个满足下述条件的进程:
① Finish[i] := false;
② Need[i, j] <= Work[j]; 若找到,执行步骤(3),否则,执行步骤(4)。
(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给他的资源,故应执行:
Work[j] :=Work[j] + Allocation[i, j];
Finish[i] :=true;
Go to step2;
(4) 如果所有进程的Finish[i] = true 都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
#include<bits/stdc++.h>
using namespace std;
#define maxsize 10
char Res[maxsize]={0}; //资源名
int Available[maxsize]={0}; //可利用资源
int Max[maxsize][maxsize]={0}; //最大需求矩阵
int Allocation[maxsize][maxsize]={0}; //已分配矩阵
int Need[maxsize][maxsize]={0}; //需求矩阵
int Work; //资源数
bool Finish[maxsize]={false};
int main(){
cout<<"请按顺序输入:资源种类,数目(q to quit)(max<=10)"<<endl;
char ch;
int Resnum=0;
while(cin>>ch&&ch!='q'){
Res[Resnum]=ch;
cin>>Available[Resnum++];
}
cout<<"当前资源目录:"<<endl;
cout<<"资源类型 资源数目"<<endl;
for(int i=0;i<Resnum;++i){
cout<<" "<<Res[i]<<" "<<Available[i]<<endl;
Work+=Available[i];
}
int n;
cout<<"请输入进程个数(max<=10)"<<endl;
cin>>n;
for(int i=0;i<n;++i){
cout<<"请按顺序输入第"<<i+1<<"个进程所需的资源类型、资源数目";
int ch1;
int num;
cin>>ch1>>num;
Need[i][ch1]=num;
if(Need[i][ch1]<=Available[ch1-1]){ //Need[i][ch1]表示第i个进程所需ch1资源的个数
Available[ch1-1]-=Need[i][ch1];
Finish[i]=true;
}
}
int flag=0;
for(int i=0;i<n;++i){
if(!Finish[i])
flag=1;
}
if(flag)
cout<<"不安全";
else
cout<<"安全";
}
内容总结
以上是互联网集市为您收集整理的银行家算法Banker‘s Algorithm(c++简单实现)全部内容,希望文章能够帮你解决银行家算法Banker‘s Algorithm(c++简单实现)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。