QUESTION:银行家算法总结及实现?

目录

QUESTION:银行家算法总结及实现?

ANSWER:

一:银行家算法介绍

1.1什么是银行家算法

1.2背景

1.3数据结构

1.4算法分析

二:安全状态和不安全状态

2.1概念

2.2安全性检查

三:算法实现

3.1流程图

3.2代码实现


ANSWER:

一:银行家算法介绍

1.1什么是银行家算法

银行家算法(Banker's Algorithm)是一种关于操作系统分配资源时避免死锁(Deadlock)产生的安全性检测算法,它类似于银行中贷款的分配策略,由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。

1.2背景

在银行中,客户为了完成某个项目需要向银行进行贷款申请,客户已经拥有部分资金,客户给出最大资金需求,银行进行对客户的贷款申请检查,如果客户完全满足申请条件,并且客户申请的资金小于银行拥有的资金总额,则完成对客户的贷款。在这一过程中,银行就像操作系统,客户就像进程,资金就像要申请的资源。

1.3数据结构

1.资源种类数R:

是一个定量,R=n代表有n种资源。

2.进程数P:

也是一个定量,P=n代表有n个进程。

3.可利用的资源数向量Available:

是一个一维向量,Available[n]=k,代表n类资源可利用资源数为k。

4.最大需求矩阵Max:

是一个二维矩阵,Max[n][m]=k,代表第n个进程需要m类的最大数目为k。

5.已经分配的资源数目矩阵Allocation:

是一个二维矩阵,Allocation[n][m]=k,代表n个进程已经分配m类资源的数目为k。

6.需求矩阵Need:

是一个二维向量,Need[n][m]=k,代表进程n还需要m类资源的数目为k。

Need[n][m]=Max[n][m]-Allocation[n][m]。

1.4算法分析

为保证资金的安全,银行家规定:

(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;

(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;

(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;

(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

     Allocation   Max   AvailableABCD    ABCD  ABCDP1   0014    0656  1520 P2  1432    1942 P3  1354    1356P4  1000    1750

我们会看到一个资源分配表,要判断是否为安全状态,首先先找出它的Need,Need即Max(最多需要多少资源)减去Allocation(原本已经分配出去的资源),计算结果如下:

   NEEDABCD0642 051000020750

然后加一个全都为false的字段:

FINISHfalsefalsefalsefalse

接下来找出Need比Available小的(千万不能把它当成4位数 他是4个不同的数):

  NEED    AvailableABCD  ABCD0642  15200510<-00020750

P2的需求小于能用的,所以分配给他再回收:

NEED     AvailableABCD  ABCD0642  15200000 +14320002-------0750  2952

此时P2 FINISH的false要改成true(己完成):

FINISHfalsetruefalsefalse

接下来继续往下找,发现P3的需求为0002,小于能用的2952,所以资源配置给他再回收:

 NEED      AvailableABCD  A B C D0642  2 9 5 20000 +1 3 5 40000----------0750  3 12 10 6

依此类推,做完P4→P1,当全部的FINISH都变成true时,就是安全状态。

二:安全状态和不安全状态

2.1概念

如果所有过程有可能完成执行(终止),则一个状态(如上述范例)被认为是安全的。由于系统无法知道什么时候一个过程将终止,或者之后它需要多少资源,系统假定所有进程将最终试图获取其声明的最大资源并在不久之后终止。在大多数情况下,这是一个合理的假设,因为系统不是特别关注每个进程运行了多久(至少不是从避免死锁的角度)。此外,如果一个进程终止前没有获取其它能获取的最多的资源,它只是让系统更容易处理。

基于这一假设,该算法通过尝试寻找允许每个进程获得的最大资源并结束(把资源返还给系统)的进程请求的一个理想集合,来决定一个状态是否是安全的。不存在这个集合的状态都是不安全的。

安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

不存在一个安全序列。不安全状态不一定导致死锁。

2.2安全性检查

1)设置两个工作向量Work=AVAILABLE;FINISH

(2)从进程集合中找到一个满足下述条件的进程,

FINISH==false;

NEED<=Work;

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+ALLOCATION;

Finish=true;

GOTO 2

(4)如所有的进程Finish= true,则表示安全;否则系统不安全。

三:算法实现

3.1流程图

3.2代码实现

银行家算法总结及实现相关推荐

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

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

  2. 二十三、死锁的处理策略---避免死锁(银行家算法)

    一.知识总览 二.什么是安全序列 **所谓安全序列:**就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成,只要能找出一个安全序列,系统就是安全状态.当然,安全序列可能有多个. 如果分配了资源 ...

  3. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  4. 随机洗牌算法 银行家算法

    1. 随机洗牌算法 https://blog.csdn.net/qq_26399665/article/details/79831490 Fisher-Yates Shuffle算法 最早提出这个洗牌 ...

  5. 实验三银行家算法linux,操作系统原理与linux_银行家算法实验报告.doc

    . . . PAGE 成 绩 评 阅 人 评阅日期 计算机科学与技术系 实 验 报 告 课程名称: 操作系统原理与linux 实验名称: 银行家算法 2011年 04 月 实验三 银行家算法 一.实验 ...

  6. 银行家算法的分析与实现

    文章目录 1 银行家算法的分析与实现 1 银行家算法的分析与实现 问题描述: 研究一个银行家如何将总数一定的资金,安全的借给若干个顾客,使顾客既能满足对资金的需求,也使银行家可以收回自己的全部资金,不 ...

  7. Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?...

    Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法,  也就是四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一, 这个算法比四舍五入更精确些. R ...

  8. 银行家算法回顾[JAVA实现]

    为什么80%的码农都做不了架构师?>>>    分析了一下银行家算法,基于银行家算法做了一个小程序. 银行家算法主要用于操作系统进程管理程序中,用于防止死锁. 接下来这段代码将模拟这 ...

  9. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  10. 利用银行家算法避免死锁(C++实现)

    算法思想: 代码: #include<iostream> #include<string> using namespace std; #define numberOfProce ...

最新文章

  1. torch.backends.cudnn.deterministic 使用cuda保证每次结果一样
  2. C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.
  3. android是32-bit系统还是64-bit系统
  4. 用haslib给字符加密
  5. IIS 7 启用 gzip 静态压缩 压缩js和css文件
  6. pytorch安装换源ubuntu_PyTorch入门之PyTorch的安装
  7. Objective-C入门教程(摘录)
  8. “我很迷茫很焦虑,需要你的建议”|她在百度内网发了个求助帖
  9. 数据结构导论(第一章概论)
  10. eclipse 修改为黑色主题,并且功能比默认的方便
  11. SAP ABAP ALV 布局 特定用户 及缺省设置控制
  12. 3GPP RAN第一次F2F会议,都干了些啥?
  13. java文件 默认打开方式_修改文件的默认打开方式(亲测有效)
  14. 我喜欢这首歌......
  15. 抖音seo源码.源代码开发可二开搭建/抖音seo优化系统代开发
  16. .bat文件打开方式
  17. 好用的iOS开发工具
  18. MySQL中的各种锁(行锁、间隙锁、临键锁等等LBCC)
  19. MDI开启时禁止创建新文档
  20. python调用spss算法_python – SPSS中的matplotlib图

热门文章

  1. ESP32 分区介绍
  2. 每日一题(17)—— 关键字volatile的作用和三个不同的应用场合
  3. python相关知识介绍一种理财方法_我是如何使用python来确定理财策略的
  4. python特征匹配 查找_特征匹配+单纯形查找对象
  5. LeetCode 2076. 处理含限制条件的好友请求(并查集)
  6. LeetCode 1058. 最小化舍入误差以满足目标(排序+贪心)
  7. 剑指Offer - 面试题43. 1~n整数中1出现的次数(找规律+公式)
  8. idea中git如何切换到master_IDEA中Git的使用
  9. python获取当前路径的方法_Python获取脚本所在目录的正确方法【转】
  10. 【Python基础知识-pycharm版】第三节-列表