银行家算法中的数据结构

(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>的插件,直接屏蔽即可.

如果在使用中发现问题,望指出.

银行家算法##大魔王程序员相关推荐

  1. 【数据结构与算法】程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码

    [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 文章目录 [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 1. 数组 (Arra ...

  2. python银行家算法代码_避免死锁的银行家算法C++程序实现

     本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  3. 为什么“不懂数据结构与算法”的程序员一定走不远?

    踏上了编程之路,也就意味着你选择了一种终身学习的生活方式.每一个程序员都要练就十八般武艺,而掌握数据结构与算法就像修炼了九阳神功.换句话说,掌握了数据结构与算法,你的内功修炼速度就会有质的飞跃. &q ...

  4. 十大编程算法助程序员走上大神路

    概述:编程算法,是完成程序逻辑的主要途径.本文推荐十大编程算法,有利于程序员的编程逻辑. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n lo ...

  5. 程序员面试算法_程序员的前20个搜索和排序算法面试问题

    程序员面试算法 大家好,如果您正在准备编程工作面试或正在寻找新工作,那么您知道这不是一个容易的过程. 在您职业的任何阶段,您都必须幸运地接到电话并进行第一轮面试,但是在初学者方面,当您寻找第一份工作时 ...

  6. 10 大编程算法帮助程序员踏上“高手”层次,了解一下,你绝对不亏!

    1.快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明 ...

  7. 不懂算法的程序员不是好工程师!

    时刻提醒自己,技术之路修远兮,予以自勉. 作者 |  菜鸟奋斗史 责编 | 胡巍巍 算法主要衡量标准 时间复杂度(运行时间) 在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算 ...

  8. 避免死锁的银行家算法C++程序实现

     本篇博文为追忆曾经写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  9. java程序员基础算法_java程序员必知的十种程序算法

    <java程序员必知的十种程序算法>由会员分享,可在线阅读,更多相关<java程序员必知的十种程序算法(11页珍藏版)>请在人人文库网上搜索. 1.java程序员必学的十种程序 ...

最新文章

  1. 受用一生的高效 PyCharm 使用技巧(四)
  2. spring cloud alibaba版本选择
  3. python爬虫框架排行榜-8个最高效的Python爬虫框架,你用过几个?
  4. php加载外部html,VUE页面加载外部HTML实例详解
  5. 轻松学习JavaScript十七:JavaScript的BOM学习(二)
  6. 中软国际 问题一php的优缺点
  7. 给地球上的22.8万种植物建立图像索引
  8. 基本飞行模式中英文对照
  9. 让应用通过苹果审核出人头地的10个方法
  10. unity透明通道加颜色_Unity的Gamma颜色空间和Linear颜色空间的小研究
  11. 干货|程序员有哪些含金量高的证书可以考?
  12. SOLID 原则之依赖倒置原则
  13. js声明变量过程,程序都做了什么?
  14. android 4.0 原生短信,Android 4.0 短信发不出去解决办法
  15. 解决typora 或markdown文档图片失效问题
  16. QT武林秘籍——我在QT中遇到的那些坑
  17. 专访铃盛(RingCentral)何必苍:以不断创新的MVP赋能未来混合办公
  18. 5G Massive MIMO的基础知识
  19. 这样的简历,到哪里都是被淘汰的命!
  20. 虚拟现实,带你走进一个不一样的科学探索世界

热门文章

  1. Java项目源码SSM宿舍管理系统|寝室
  2. 《霜冷长河》之《壮士》----英雄归来
  3. EasyCVR使用大华SDK接入时录像显示失败是什么原因?该如何解决?
  4. getWriter()
  5. layui实现空气日历动态日期变色
  6. 生日蛋糕(noi99)
  7. Windows 11强势来袭,一文带你了解全部更新内容
  8. HTTP Status code(状态码)和 Status text(状态文本)
  9. MySQL数据库综合运用——快递管理系统
  10. Linux用户态进程监控内存写排查踩内存