银行家算法##大魔王程序员
银行家算法中的数据结构
(1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个元素代表一类可利用资源的数目,其初始值是系统中所配置的该类型全部可用资源的数目,其数值随该类资源的分配和回而动态的改变.如果Available[j]=k,则表示系统中现有Rj类资源k个.
(2)最大需求矩阵Max.这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求.Max[i,j]=k,则表示进程i需要Rj类资源的最大数目为k.
(3)分配矩阵Allocation.这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一个进程的资源数.如果Allocation[i,j]=k,则表示进程i当前已分得Rj类资源的数目为k.
(4)需求矩阵Need.这也是一个n*m的矩阵,用以表示每个进程尚需的各类资源数.如果Need[i,j]=k,则表示进程i还需要Rj类资源k个方能完成其任务.
银行家算法
设Request i(i是下标) 是进程Pi的请求向量,如果Request i[j]=k,表示进程pi需要K个Rj类型的资源.当pi发出资源请求后,系统按下述步骤进行检查:
(1)如果Request i[j] <= Need[i,j],便转向步骤(2);否则认为出错,因为它所需的资源数已超过它所宣布的最大值.
(2)如果Request i[j] <= Available[j],便转向步骤(3);否则,表示尚无足够的资源,p i须等待.
(3)系统试探的把资源分配给进程p i,并修改下面数据结构中的数值:
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];
(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态.若安全,才正式将资源分配给进程p i,已完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程p i等待.
安全性算法
系统执行的安全性算法可描述如下:
(1)设置两个向量:1.工作向量work,他表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,在执行安全算法开始时,work = Available; 2.finish:它表示系统有足够的资源分配给进程,使之运行完成.开始时先做finish[i] = false;当有足够资源分配给进程时,再令finish[i] = true;
(2)从进程集合中找到一个能满足下述条件的进程:
1.finish[i] = false;
2.Need[i,j] <= work[j];
若找到,执行步骤(3),否则,执行步骤(4)
(3)当进程p i获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
work[j] = work[j] + Allocation[i,j];
finish[i] = true;
go to step 2
(4)如果所有进程的finish[i] = true都满足,则表示系统处于安全状态;否则,系统处于不安全状态
代码实现:
为了模仿计算机进程,编者使用随机值进行初始化
int main() {int progress ;int resource;bool flag = false; //最后判断安全序列的标志bool flag1 = false;printf("请输入进程个数:"); int test = scanf("%d",&progress); //行数while(test == 0)//输入异常机制{printf("输入有误,请重试!\n");fflush(stdin); //清除缓存printf("请输入进程个数:"); test = scanf("%d",&progress);}printf("请输入资源个数:");int test1 = scanf("%d",&resource); //列数while(test1 == 0)//输入异常机制{printf("输入有误,请重试!\n");fflush(stdin); //清除缓存printf("请输入资源个数:"); test1 = scanf("%d",&resource);}int **Need = NULL;int **Allocation = NULL;int **Request = NULL;Need = OpenSpace2(Need,progress,resource);Allocation = OpenSpace2(Allocation,progress,resource);Request = OpenSpace2(Request,progress,resource);int *Available = (int *)malloc(sizeof(int)*resource);assert(Available != NULL);int *arr = (int*)calloc(progress,sizeof(int)); //保存安全序列assert(arr != NULL);Init(Need,Allocation,Request,Available,progress,resource);Show(Need,Allocation,Request,Available,progress,resource);flag1 = Safe(Need,Allocation,Request,Available,progress,resource,arr);if(!flag1){Delete(Need,Allocation,Request,Available,progress,arr);return 0;}flag = Bank(Need,Allocation,Request,Available,progress,resource,arr);if(flag){printf("安全序列为:\n");for(int i =0; i< progress;i++){printf("P%d ",arr[i]);}printf("\n");}//Show(Need,Allocation,Request,Available,progress,resource);Delete(Need,Allocation,Request,Available,progress,arr);return 0; }
bool Bank(int **Need,int **Allocation,int **Request,int * Available,int progress,int resource,int *arr) {assert(Need != NULL && Allocation != NULL && Request != NULL);//bool *finish =(bool*)malloc(sizeof(bool)*progress);bool flag = false;//assert(finish != NULL);int k;printf("请输入请求向量进程号(从0开始):");int test = scanf("%d",&k);while(test == 0 || k >=progress || k < 0 )//输入异常机制{printf("输入有误,请重试!\n");fflush(stdin); //清除缓存printf("请输入请求向量进程号(从0开始):"); test = scanf("%d",&k);}printf("请输入请求向量(回车分隔):\n");for(int i = 0; i < resource ;i++){int test1 = scanf("%d",&Request[k][i]); if(test1 == 0) //输入异常机制{fflush(stdin); //清除缓存printf("输入有误,请重新输入!\n");i--;}if(Request[k][i] > Need[k][i] ){printf("输入有误,请重新输入!\n");i--;}}int j = 0; for( j = 0; j < resource;j++){if(Request[k][j] > Available[j]){printf("尚无足够资源,P%d需等待\n",k);return false;}flag = true; }if(flag){for( j = 0;j < resource;j++){Available[j] -=Request[k][j];Allocation[k][j] += Request[k][j];Need[k][j] -= Request[k][j];}if(!Safe(Need,Allocation,Request,Available,progress,resource,arr))//如果不安全{flag = false;for( j = 0; j < resource;j++)//恢复资源{Available[j] +=Request[k][j];Allocation[k][j] -= Request[k][j];Need[k][j] += Request[k][j]; } }}if(flag == false){ printf("系统处于不安全状态\n");return false;}else{ printf("系统处于安全状态\n");return true;} }
bool Safe(int **Need,int **Allocation,int **Request,int * Available,int progress,int resource,int *arr) {assert(Need != NULL && Allocation != NULL && Available != NULL);int k = 0; //arr的下标int *Work = (int *)malloc(sizeof(int)*resource);assert(Work != NULL);for(int i = 0; i< resource;i++){Work[i] = Available[i];}bool *finish =(bool*)malloc(sizeof(bool)*progress);assert(finish != NULL);for(int i = 0; i< progress;i++){finish[i] = false;}//Show(Need,Allocation,Request,Available,progress,resource);for(int i = 0;i < progress; i++){if(!finish[i]){int j;for( j = 0; j < resource;j++){if(Need[i][j] > Work[j]) {break; //判断下一个进程是否安全}if(j+1 == resource) //即Need中[i]向量,所有的值都小于Work向量的值 j为下标,resource为资源数{finish[i] = true;arr[k++] = i;for(j = 0;j < resource;j++){Work[j] += Allocation[i][j];}i = -1; //重新开始扫描}}}}for(int i = 0; i < progress; i++){if(!finish[i]){free(Work);free(finish);printf("此时处于不安全的状态\n");return false;}}free(Work);free(finish);printf("此时处于安全的状态\n");return true; }
void Init(int **Need,int **Allocation,int **Request,int * Available,int progress,int resource)//初始化 {assert(Need != NULL && Allocation != NULL);srand((unsigned)time( NULL ) ); for(int i = 0; i < progress;i++) {for(int j = 0 ;j< resource; j++){Need[i][j] = rand()%8+0;Allocation[i][j] = rand()%7+0;Request[i][j] = 0;}}for(int i = 0; i < resource;i++){Available[i] = rand()%10+5;} }
void Show(int **Need,int **Allocation,int **Request ,int * Available,int progress,int resource) {assert(Need != NULL && Allocation != NULL);printf("需求矩阵:\t\t分配矩阵:\t\t需求矩阵:\n");for(int i = 0; i < progress;i++) {for(int j = 0 ;j< resource; j++){printf("%d ",Need[i][j]);}printf("\t\t\t");for(int j = 0 ;j< resource; j++){printf("%d ",Allocation[i][j]);}printf("\t\t\t");for(int j = 0 ;j< resource; j++){printf("%d ",Request[i][j]);}printf("\n");}printf("可利用资源向量:\n");for(int i = 0; i < resource;i++){printf("%d ",Available[i]);}printf("\n"); }
依次拼接即可使用,如果没有<vdl.h>的插件,直接屏蔽即可.
如果在使用中发现问题,望指出.
银行家算法##大魔王程序员相关推荐
- 【数据结构与算法】程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码
[数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 文章目录 [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 1. 数组 (Arra ...
- python银行家算法代码_避免死锁的银行家算法C++程序实现
本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...
- 为什么“不懂数据结构与算法”的程序员一定走不远?
踏上了编程之路,也就意味着你选择了一种终身学习的生活方式.每一个程序员都要练就十八般武艺,而掌握数据结构与算法就像修炼了九阳神功.换句话说,掌握了数据结构与算法,你的内功修炼速度就会有质的飞跃. &q ...
- 十大编程算法助程序员走上大神路
概述:编程算法,是完成程序逻辑的主要途径.本文推荐十大编程算法,有利于程序员的编程逻辑. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n lo ...
- 程序员面试算法_程序员的前20个搜索和排序算法面试问题
程序员面试算法 大家好,如果您正在准备编程工作面试或正在寻找新工作,那么您知道这不是一个容易的过程. 在您职业的任何阶段,您都必须幸运地接到电话并进行第一轮面试,但是在初学者方面,当您寻找第一份工作时 ...
- 10 大编程算法帮助程序员踏上“高手”层次,了解一下,你绝对不亏!
1.快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明 ...
- 不懂算法的程序员不是好工程师!
时刻提醒自己,技术之路修远兮,予以自勉. 作者 | 菜鸟奋斗史 责编 | 胡巍巍 算法主要衡量标准 时间复杂度(运行时间) 在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算 ...
- 避免死锁的银行家算法C++程序实现
本篇博文为追忆曾经写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...
- java程序员基础算法_java程序员必知的十种程序算法
<java程序员必知的十种程序算法>由会员分享,可在线阅读,更多相关<java程序员必知的十种程序算法(11页珍藏版)>请在人人文库网上搜索. 1.java程序员必学的十种程序 ...
最新文章
- 受用一生的高效 PyCharm 使用技巧(四)
- spring cloud alibaba版本选择
- python爬虫框架排行榜-8个最高效的Python爬虫框架,你用过几个?
- php加载外部html,VUE页面加载外部HTML实例详解
- 轻松学习JavaScript十七:JavaScript的BOM学习(二)
- 中软国际 问题一php的优缺点
- 给地球上的22.8万种植物建立图像索引
- 基本飞行模式中英文对照
- 让应用通过苹果审核出人头地的10个方法
- unity透明通道加颜色_Unity的Gamma颜色空间和Linear颜色空间的小研究
- 干货|程序员有哪些含金量高的证书可以考?
- SOLID 原则之依赖倒置原则
- js声明变量过程,程序都做了什么?
- android 4.0 原生短信,Android 4.0 短信发不出去解决办法
- 解决typora 或markdown文档图片失效问题
- QT武林秘籍——我在QT中遇到的那些坑
- 专访铃盛(RingCentral)何必苍:以不断创新的MVP赋能未来混合办公
- 5G Massive MIMO的基础知识
- 这样的简历,到哪里都是被淘汰的命!
- 虚拟现实,带你走进一个不一样的科学探索世界