操作系统: 银行家算法的分析和代码实现(c++语言)
来源:互联网 发布:qq赚钱软件 编辑:程序博客网 时间:2024/05/29 14:45
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
是一个含有m个元素的数组,其中的每一个元素代表一类系统可提供的的资源数目总数。如果resource[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Claim
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Claim[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。
4)还可使用的资源数available向量
这是一个含有m个元素的数组,每个元素代表一类资源还能够使用的数目。
算法的执行流程很简单:
(1)先用resource[i]-sum[i](各个进程占用某个资源的总数)求出available[i]数组
(2)然后遍历n*m的矩阵,只要有一个进程对各类资源的需求均小于available数组,就将其认为是安全的,并且结束后将其占用的资源释放,即available[j]+=alloc[i][j];
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
是一个含有m个元素的数组,其中的每一个元素代表一类系统可提供的的资源数目总数。如果resource[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Claim
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Claim[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。
4)还可使用的资源数available向量
这是一个含有m个元素的数组,每个元素代表一类资源还能够使用的数目。
算法的执行流程很简单:
(1)先用resource[i]-sum[i](各个进程占用某个资源的总数)求出available[i]数组
(2)然后遍历n*m的矩阵,只要有一个进程对各类资源的需求均小于available数组,就将其认为是安全的,并且结束后将其占用的资源释放,即available[j]+=alloc[i][j];
(3)相反,在上一个步骤中,如果找不到这样的一个序列,我们就认为是不安全序列,不允许分配,程序结束。
#include <iostream>#include <string>#include <cstring>#include <vector>using namespace std;#define M 4#define N 3int 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; } }}elsecontinue;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;}
2 0
- 操作系统: 银行家算法的分析和代码实现(c++语言)
- 操作系统–银行家算法c语言代码
- C语言实现操作系统银行家算法
- C语言实现 操作系统 银行家算法
- 操作系统c实现银行家算法
- 操作系统之——银行家算法C语言实现
- 银行家算法的C语言实现
- C语言实现银行家算法
- C语言实现银行家算法
- [算法]操作系统进程通信(预防死锁)算法 Dijkstra银行家算法 C语言实现
- 银行家算法的C实现
- [C#]银行家算法的实现
- 银行家算法的一种实现——使用C语言
- c语言银行家算法
- 银行家算法 C语言
- 【操作系统】小型银行家算法实现
- 操作系统实验,用C或者C++实现银行家算法
- 【c语言/vs2010】银行家算法
- React Native真机调试
- Material Design 之 Theme
- 单链表之创建与求单链表的长度
- react-native里TextInput遇到的一些问题及解决方案
- linux文件和目录管理
- 操作系统: 银行家算法的分析和代码实现(c++语言)
- [python]一个简单的听写练习工具
- 什么是rest
- ViewAnimation的基本使用方法
- mysql中UNIX_TIMESTAMP和FROM_UNIXTIME时间戳
- mssql server 安装问题处理
- 逆序数的还原详解 树状数组+二分
- cocos2d-x 3.9 多点触控之iOS监听无效(只能监听到单点触控)
- 基于8255扩展的步进电机的控制