文章目录

  • 安全序列
  • 通俗理解模型
    • 初始借完钱
    • 分析借钱的安全序列
  • 银行家算法
    • 核心思想
    • 资源表示
    • 安全性算法分析系统状态
    • 银行家算法实现
      • 思路分析
      • 银行家算法步骤
      • 安全性算法步骤
  • 升华思维

安全序列

如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。

当然,安全序列可能有多个

通俗理解模型

此时你是一位成功的银行家,手里有100亿资金…

此时有三个企业想找你贷款,分别是企业B,企业A,企业T

B:“大哥,我最多要借70亿”

A:“大哥,我最多要借40亿”

T:“大哥,我最多要借50亿”

有个规矩:借给企业的钱达不到企业提出的最大要求,那么你借的钱就打水漂了

当然你也不想你的钱打水漂,那么就要考虑 怎么借才能保证自己的100亿不打水漂

初始借完钱

最大要求 已经借走 最多再借
B 70 20 50
A 40 10 30
T 50 30 20

此时你手里还有40亿

分析借钱的安全序列

  1. 此时B想跟你借30亿,你敢借吗?

    1. 假如你答应了:借给了B 30亿,那么你的手里还有10亿,上面的图稍作修改,如下图:

    2. 最大要求 已经借走 最多再借
      B 70 20+30=50 50-30=20
      A 40 10 30
      T 50 30 20
    3. 如果其他企业再提出借20亿,那你巴比Q了,显然你借不了,你的钱打水漂了,所以这个钱不能借。不安全

  2. 此时A想跟你借20亿,你敢借吗?

    1. 假如你答应了:借给了A 20亿,那么你的手里还有20亿,上面的图稍作修改,如下图:

    2. 最大要求 已经借走 最多再借
      B 70 20 50
      A 40 10+20=30 30-20=10
      T 50 30 20
    3. 接下来你可以把这20亿都借给T企业。等他把钱全部还回来了,手里就有50亿,再把这些钱借给B企业。等他把钱全部还回来了,手里就有70亿,最后再借给A企业。这样你的钱就全回来了。

    4. 所以此借钱序列(安全序列):T->B->A

    5. 根据上述思路自行验证这个序列:A->T->B

银行家算法

核心思想

在进程提出资源申请时, 先预判此次分配是否会导致系统进入不安全状态。 如果会进入不安全状态, 就暂时不答应这次请求, 让该进程先阻塞等待。

核心是:安全性算法

资源表示

把单维的数字拓展为多维的向量。 比如: 系统中有5个进程 P0~P4, 3种资源 R0~R2, 初始数量为 (10, 5, 7)

进程 最大需求 已经分配 最多需要
P0 (7,5,3) (0,1,0) (7,4,3)
P1 (3,2,2) (2,0,0) (1,2,2)
P2 (9,0,2) (3,0,2) (6,0,0)
P3 (2,2,2) (2,1,1) (0,1,1)
P4 (4,3,3) (0,0,2) (4,3,1)

此时已经分配了(7,2,5),还剩余(3,3,2)

安全性算法分析系统状态

  1. 此时系统是否处于一种安全状态?若是,则找出一条安全序列。

    1. 首先,检查剩余的资源是否满足各个进程的需求

    2. 我们发现能满足P1、P3的需求。那先分配给P1(将P1加入安全序列),等待他结束,那么剩余资源将变为(5,3,2);再分配给P3(将P3加入安全序列),等他结束,剩余资源将变为(7,4,3)。如下图:

    3. 进程 最大需求 已经分配 最多需要
      P0 (7,5,3) (0,1,0) (7,4,3)
      P2 (9,0,2) (3,0,2) (6,0,0)
      P4 (4,3,3) (0,0,2) (4,3,1)
    4. 将P4、P2、P0(他们最多需要的资源数小于剩余资源)加入安全序列,最终可得到一个安全序列。安全性算法

  2. 实际做题(手算)的情况下可用更快速的方法找到一个安全序列

    1. (3, 3, 2) 可满足 P1、 P3, 说明无论如何, 这两个进程的资源需求一定是可以依次被满足的, 因此P1、 P3 一定可以顺利的执行完, 并归还资源。 可把 P1、 P3 先加入安全序列。(2, 0, 0) + (2, 1, 1) + (3, 3, 2) = (7, 4, 3)
      剩下的 P0、 P2、 P4 都可被满足。 同理, 这些进程都可以加入安全序列 。于是, 5个进程全部加入安全序列, 说明此时系统处于安全状态, 暂不可能发生死锁
  3. 特殊:找不到安全序列的列子

    1. 进程 最大需求 已经分配 最多需要
      P0 (8, 5, 3) (0, 1, 0) (8, 4, 3)
      P1 (3,2,2) (2,0,0) (1,2,2)
      P2 (9, 5 ,2) (3, 0, 2) (6, 5, 0)
      P3 (2,2,2) (2,1,1) (0,1,1)
      P4 (4, 3, 6) (0, 0, 2) (4, 3, 4)
    2. 资源总数(10,5,7),剩余可用资源(3,3,2)

    3. (3, 3, 2) 可满足 P1、 P3,可把 P1、 P3 先加入安全序列,剩余可用资源(7, 4, 3)

    4. 进程 最大需求 已分配 最多还需要
      P0 (8, 5, 3) (0, 1, 0) (8, 4, 3)
      P2 (9, 5 ,2) (3, 0, 2) (6, 5, 0)
      P4 (4, 3, 6) (0, 0, 2) (4, 3, 4)
    5. 剩下的无法满足,每一位对比。剩下的 P0 需要 (8, 4, 3)(7, 4, 3) P2 需要 (6, 5, 0)(7, 4, 3) P4 需要 (4, 3, 4)

    6. 无法找到任何一个安全序列, 说明此时系统处于不安全状态, 有可能发生死锁

下面进入正题:银行家算法的实现

银行家算法实现

进程 最大需求Max 已分配Allocation 最多还需要Need
P0 (7, 5, 3) (0, 1, 0) (7, 4, 3)
P1 (3, 2, 2) (2, 0, 0) (1, 2, 2)
P2 (9, 0 ,2) (3, 0, 2) (6, 0, 0)
P3 (2, 2, 2) (2, 1, 1) (0, 1, 1)
P4 (4, 3, 3) (0, 0, 2) (4, 3, 1

数据结构:

n*m 矩阵 Max 表示各进程对资源的最大需求数

n*m 矩阵 Allocation 表示已经给各进程分配 了多少资源

Max – Allocation = Need 矩阵表示各进程最多还需要多少资源

长度为 m 的一维数组 Available 表示还有多少可用资源 [表示:Available = (3, 3, 2)]

用长度为 m 的一位数组 Requesti表示进程此次申请的各种资源数 [表示:Request0 = (2, 1, 1) ]

思路分析

  1. 如果 Requesti[j]≤Need[i, j] (0≤j≤m)便转向 2 ; 否则认为出错 :因为它所需要的资源数已超过它所宣布的最大值

  2. 如果 Requesti[j]≤Available[j] (0≤j≤m), 便转向 3 ; 否则表示尚无足够资源, Pi必须等待

  3. 系统试探着把资源分配给进程Pi, 并修改相应的数据(并非真的分配, 修改数值只是为了做预判

    Available = Available - Requesti;
    Allocation[i, j] = Allocation[i, j] + Requesti[j];
    Need[i, j] = Need[i, j] – Requesti[j]
    
  4. 操作系统执行安全性算法, 检查此次资源分配后, 系统是否处于安全状态。 若安全, 才正式分配; 否则, 恢复相
    应数据, 让进程阻塞等待

银行家算法步骤

  1. 检查此次申请是否超过了之前声明的最大需求数
  2. 检查此时系统剩余的可用资源是否还能满足这次请求\
  3. 试探着分配, 更改各数据结构
  4. 用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤

检查当前的剩余可用资源是否能满足某个进程的最大需求, 如果可以, 就把该进程加入安全序列,并把该进程持有的资源全部回收。
不断重复上述过程, 看最终是否能让所有进程都加入安全序列。

系统处于不安全状态未必死锁, 但死锁时一定处于不安全状态。 系统处于安全状态一定不会死锁

升华思维

死锁预防是保证系统不进入死锁状态的静态策略,其解决办法是破坏产生死锁的四个必要条件之一、下列方法中 破坏了“循环等待”条件的是( )。

A. 银行家算法
B. 一-次性分配策略
C. 剥夺资源法
D. 资源有序分配策略

产生死锁的四个必要条件:互斥、不剥夺、请求和保持、循环等待
资源有序分配策略可以限制循环等待条件的发生。选项A判断是否为不安全状态;选项B破坏了占有请求条件;选项C破坏了非剥夺条件。

某系统中有三个并发进程都需要四个同类资源,则该系统必然不会发生死锁的最少资源是( )。

A. 9
B. 10
C. 11
D. 12

资源数为9时,存在三个进程都占有三个资源,为死锁;资源数为10 时,必然存在一个进程能拿到4个资源,然后可以顺利执行完其他进程。

A. Ⅱ、Ⅲ

B. Ⅰ、Ⅱ

C. Ⅰ

D. Ⅰ、Ⅲ

[操作系统] 银行家算法相关推荐

  1. 操作系统——银行家算法(银行家和房地产开发商的爱恨情仇)

    操作系统--银行家算法 什么是银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避 ...

  2. 操作系统银行家算法计算机四级,【NCRE四级网络工程师】操作系统多选题

    友情提示:此篇文章大约需要阅读 7分钟54秒,不足之处请多指教,感谢您的阅读. 保存在进程控制块中的是 进程标识符 进程当前状态 代码段指针 PCB的内容可以分为调度信息和现场信息两大部分.调度信息供 ...

  3. 操作系统 | 银行家算法及代码实现

    参考博客 [操作系统]死锁避免之银行家算法_少侠露飞的学习笔记-CSDN博客 [操作系统]避免死锁--银行家算法_明昕ztoy的博客-CSDN博客_银行家算法避免死锁 实现思路 当一个进程申请使用资源 ...

  4. 操作系统-银行家算法(Java实现)

    一.银行家算法思想 银行家算法是最著名的死锁避免算法,其思想是:将操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款.操作系统按照银行家制定 ...

  5. c语言银行家算法模拟程序,C语言实现 操作系统 银行家算法

    /**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin, 可能存在多类资 ...

  6. 银行家算法 计算机操作系统,计算机操作系统 银行家算法.doc

    银行家算法 //breaker.h文件代码 #include using namespace std; int Test_Request(int *,int *); //测试函数 void Assig ...

  7. 计算机操作系统——银行家算法

    1.实验目的: 银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法.本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁.产生死锁的必要条件.安全状态等重要概念,并掌握 ...

  8. 操作系统 银行家算法及相关例题

    银行家算法 Dijkstra的银行家算法是最具有代表性的避免死锁的算法,这个算法因能用于银行系统现金贷款的发放而得名. 安全状态 所谓安全状态,是指系统能按某种进程顺序(P1,P2,-,Pn)(称&l ...

  9. 操作系统——银行家算法的模拟实现

    一.实验目的 (1)理解银行家算法. (2)掌握进程安全性检查的方法与资源分配的方法. 二.实验内容与基本要求 编制模拟银行家算法的程序,并给出一个例子验证所编写的程序的正确性. 要求例子中包含分配安 ...

最新文章

  1. 麻省理工学院开放 2018 自动驾驶课程
  2. 【模型解读】从LeNet到VGG,看卷积+池化串联的网络结构
  3. db2 最大分区数_db2 查询表分区数据库
  4. win创建linux目录,Windows与Linux上的文件创建时间
  5. c语言面试会问10个数排序吗,c语言面试最必考的十道试题,求职必看!!!
  6. bug-android之INSTALL_FAILED_NO_MATCHING_ABIS
  7. 类似GoogleMap地图网站的简单实现(1)
  8. 医疗健康领域的短文本解析探索----文本纠错
  9. Spring已集成jsp的环境下同时集成Velocity
  10. Java 百度OCR 身份证识别
  11. 基于Halcon学习的二维码识别【六】pdf417_bottle.hdev
  12. 对于三极管饱和状态的一些浅见——与网友的讨论贴
  13. 苹果Mac删除windows后无法合并分区的简单解决方法
  14. oracle中number的用法,Oracle Number数字
  15. 服务器磁盘配置信息,服务器磁盘阵列配置
  16. Java Attach机制
  17. 解决Chrome、Safair、Webkit等内核浏览器默认文本域和文本
  18. DNS无法解析IP_DNS之基本原理
  19. SQL员工基本工资表题目及答案
  20. 小小白的Android入门之计算器学习

热门文章

  1. 树言树语:360、金山、可牛 看清楚后面的敌人
  2. 教育孩子的11条法则
  3. linux测试网络带宽极限,iperf 测试极限带宽
  4. 论文阅读-Learning Deep CNN Denoiser Prior for Image Restoration
  5. seq2seq模型案例分析
  6. cxf拦截器,实现对接收到的报文和发送出去的报文格式自定义
  7. javaSE学习笔记——第四天循环结构、方法等
  8. android 外挂字幕接口
  9. SuperMap iMobile Lite for iOS 9D 入门工程配置详解
  10. 2022年最新河北建筑安全员模拟题库及答案