银行家算法

这篇具有很好参考价值的文章主要介绍了银行家算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

银行家算法概述

银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

银行贷款案例

假设客户A、B、C 三人向银行贷款用于建房,分别需要贷款70万、60万、40万,而银行只有100万,已知A、B、C三人只有贷款额足够时,他们才能保证建房完成并归还贷款,否则将无法归还贷款。银行需要使用什么方式才能保证贷款是安全的?

分析:A、B、C三人合计的资金需求是170万,显然银行无法直接满足三者的需求。

如果刚开始ABC三人分布借走了20万,20万,20万

客户 最大需求 已借贷 最多还会借
A 70 20 50
B 60 20 40
C 40 20 20

可以算出,客户A、B、C最多还要借50、40、20,而银行已经借出60万(20+20+20),银行剩余40万。

A再次申请50万,能批准吗?

那么此时,假设客户A申请借50万,而银行最多只能借出40万,那么如果银行将40万借给A。

客户 最大需求 已借贷 最多还会借
A 70 20+40 10
B 60 20 40
C 40 20 20

显然此时A无法完成建房的操作,B和C也不能完成建房的操作。这就导致A、B、C三个客户一直占有者已分配的钱,但是又无法归还银行,这种情况我们称为不安全序列。也就意味着A第二次申请50万的操作,银行不能批准。

B再次申请40万,能批准吗?或者C申请20万,能批准吗?

通过前面的图我们知道B还需要40万。那我们试着分配40万给B

客户 最大需求 已借贷 最多还会借
A 70 20 10
B 60 20+40 -
C 40 20 20
  1. 我们可以看到B再得到40万后,可以完成建房的操作,于是归还了全部的贷款60万,于是银行此时有60万。
客户 最大需求 已借贷 最多还会借
A 70 20 10
C 40 20 20
  1. 此时客户A申请50万,银行批准这50万的贷款,而此时银行剩余10万,当客户A完成了贷款的使用后,归还了贷款,此时银行剩余80万。
客户 最大需求 已借贷 最多还会借
C 40 20 20
  1. 此时C申请20万,银行当前余额80万,可以批准这个操作,于是C也完成了建房的操作。

我们把这个分配顺序(B > A > C)叫做安全序列。
安全序列可以有多个,按照上面的操作,也可以是B > C > A
或者 C > A >B ,C > B > A。
我们上面的操作是借出 > 归还 > 借出 > 归还,如果银行的资源比较多的时候,可以一次性满足多个客户,并且可以找到安全序列,那么也可以 借出 D > 借出 E > 归还 E >…

安全序列和不安全序列

当资源分配过程的策略可以满足所有参与者能够完成执行的时候,我们称指为安全序列。如果分配过程出现无解的时候,我们称为不安全序列。
比如下面这个场景,银行已经分配90万,剩余10万,此时剩余的10万无论分配给谁,都无法保证A、B、C完成建房。

客户 最大需求 已借贷 最多还会借
A 70 50 20
B 60 30 30
C 40 10 30

于是这个无论如何都没有解,A、B 、C只能这样僵持着,我们称这个过程为死锁。
如果分配了资源之后,系统中找不到任何一种安全序列,系统将会进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然了,如果有进程提前归还了一些资源,那么系统也可能重新回到安全状态,不过我们分配资源之前总是要考虑到最坏的情况。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入了不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是不安全状态)。
因此可以在资源分配前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求,这就是银行家算法的核心思想。

多维度资源分配

前面的案例,银行家算法,里面的资源只有钱,对于操作系统而言,它的资源是多种多样的。我们利用银行家算法这种思想,作为操作系统资源的分配策略,用于避免死锁。

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

对于计算机而言,计算机中有各种各样的资源,也有各种各样的进程,它们所需要的资源也不相同。
我们可以将资源扩展成多维度的向量。比如系统中有4个进程P0~03,有三种资源R0 ~ R2,系统持有的初始资源Avaiable(7,10,6)

客户 最大需求 已分配 最多还需要
P0 (7,4,5) (3,1,3) (4,3,2)
P1 (3,4,2) (0,1,0) (3,3,2)
P2 (4,1,1) (1,1,1) (3,0,0)
P3 (3,4,2) (2,1,0) (1,3,2)

经过计算,已经分配的资源(6,4,4),剩余的资源(1,6,2)
此时系统是否处于安装状态?
尝试找到一个安全序列
一次检查剩余的资源(2,6,2)是否满足各进程的需求。
可以发现剩余资源数不能满足P0,P1,P2 进程的运行,当检查P3时发现,剩余资源数(1,6,2)可以满足P3进程的需求,于是把P3加入到安全序列,于是P3可以顺利执行结束,并将P3持有的全部资源归还给系统,此时系统状态如下

客户 最大需求 已分配 最多还需要
P0 (7,4,5) (3,1,3) (4,3,2)
P1 (3,4,2) (0,1,0) (3,3,2)
P2 (4,1,1) (1,1,1) (3,0,0)

P3结束后,剩余可用资源数为(3,7,2)
继续一次检查剩余资源可满足满足的进程,可以发现不能满足P0进程的运行,可以满足P1或者P2的运行,可以将P1加入到安全序列(也可以将P2加入到安全序列),我们此时取P1
于是当资源满足P1时,P1执行完成,并归还资源

客户 最大需求 已分配 最多还需要
P0 (7,4,5) (3,1,3) (4,3,2)
P2 (4,1,1) (1,1,1) (3,0,0)

当P1结束后,归还资源,那么剩余资源是(3,8,2)
继续检查,可以发现剩余资源不能满足P0,但是可以满足P2的运行,于是我们分配资源给P2

客户 最大需求 已分配 最多还需要
P0 (7,4,5) (3,1,3) (4,3,2)

当P2运行完成,归还资源后,系统剩余资源(4,9,3),于是满足了P0,那么此时P0申请资源,P0也能顺利完成。
那么按照刚才的执行过程,P3 > P1 > P2 > P0 这个分配过程就可以满足所有进程的执行,我们称这个分配过程为安全序列。
实际操作用,我们可以让还需要资源数少的进程先运行,因为它们更容易满足剩余资源的分配。

操作系统资源分配

假设系统有n个进程,m种资源,每个进程在运行前先声明对各种资源的最大需求数,则可以按照nm的矩阵(可以使用二维数组实现)表示所有进程对各种资源的最大需求数。不妨称为最大需求矩阵Max,则Max[i,j]=k表示进程Pi最多需要K个资源Rj。同理,系统看可以用一个nm的分配矩阵Allocation表示对所有进程的资源分配情况。Max-Allocation=Need矩阵,表示各进程最多还需要多少各类资源。另外,还需要一个长度为m的一维数组Avaiable表示当前系统中还有多少可用资源。
某进程Pi向系统申请资源,可用一个长度为m的以为数组 R e q u e s t i Request_i Requesti表示本次申请的各种资源量。
可用银行家算法预判本次分配是否会导致系统进入不安全状态
①如果 R e q u e s t i Request_i Requesti[j]<=Need(i,j)(0<=j<=m) 便转向②;否则认为出错。
②如果 R e q u e s t i Request_i Requesti[j]<=Avaiable(j)(0<=j<=m) 便转向③;否则表示尚无足够的资源,Pi需要等待。
③系统试探着把资源分配给进程Pi,并修改相应的数据(并非真的分配,修改数据只是为了做预判):
Avaiable = Avaiable - R e q u e s t i Request_i Requesti
Allocation[i,j] = Allocation[i,j] + R e q u e s t i Request_i Requesti[j];
Need[i,j]=Need[i,j] - R e q u e s t i Request_i Requesti[j];
④操作系统执行安全性算法,检查此资源分配后,系统是否处于安全状态。如果安全,则才正式分配;否则,恢复相应数据,让进程阻塞等待。

银行家算法,算法,算法

银行家算法总结

数据结构

长度为m的一维数组Available 表示还有多少可用资源
n * m矩阵Max 表示各进程对资源的最大需求数
n * m矩阵Allocation表示已经给各进程分配了多少资源
Max-Allocation=Need 矩阵表示各进程最多还需要多少资源
用长度为m的一维数组Request表示各进程此次申请的各种资源数

银行家算法的步骤

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

安全性算法步骤

检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入到安全序列,并把该进程持有的资源全部回收。

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

死锁的避免

最后,我们知道了银行家算法的核心思想,就可以在每次的资源请求分配之前预判该次资源分配是否安全,利用银行家算法,我们就可以知道哪些资源请求是不安全的,哪些资源请求是可以被允许的,这样就可以让程序始终处于安全状态,就可以避免死锁的产生。文章来源地址https://www.toymoban.com/news/detail-784317.html

到了这里,关于银行家算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 银行家算法(C++实现)

    目录 一、银行家算法概述 二、银行家算法需要的数组结构 三、算法概述 1.安全性算法 2.银行家算法 四、代码实现 五、实验结果验证 银行家算法 (Banker\\\'s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的

    2024年01月24日
    浏览(30)
  • 操作系统--银行家算法

    目录 1.产生死锁的原因及必要条件   1.1产生死锁的原因   1.2产生死锁的必要条件 2.处理死锁的方法 3.银行家算法 4.安全性算法 5.算法实现        如果一个进程集合里面的每个进程都在等待这个集合中的其他一个进程(包括自身)才能继续往下执行,若无外力他们将无法推

    2024年02月01日
    浏览(32)
  • 操作系统实验——银行家算法

    掌握银行家算法思想,并能编程实现。 1、在Linux环境下编译运行程序; 2、按照教材的算法编写; 3、(*)输入数据从文本文件中读出,不从键盘录入,数据文件格式见以下说明; 4、主要数据结构的变量名和教材中的一致,包括Available、Max、Allocation、Need、Request、Work、Fin

    2024年02月01日
    浏览(39)
  • C语言实现银行家算法

    银行家算法 最初是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger W. Dijkstra)于1965年提出的。当时他正致力于解决多道程序设计中产生的死锁问题。在多道程序设计中,由于不同进程之间共享有限的系统资源,如内存、I/O设备等,因此存在一个进程等待其他进程释放资源而

    2024年02月05日
    浏览(40)
  • 银行家算法 源码+实验报告(用了自取)

    XI`AN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 操作系统—银行家算法     专    业 :计算机科学与技术          班    级 :                姓    名 :                   学    号 :          实验学时 :                     

    2024年02月09日
    浏览(43)
  • 操作系统实验 银行家算法C++

    实验目的: 编程实现安全性算法及银行家算法,以帮助深刻理解银行家算法避免死锁的原理。 算法流程图:     实现代码:    验证数据: 运行结果:     说明: 本文章是在原作者的银行家算法文章基础上依据实验课要求修改和完善的,仅供参考,侵权删。  原作者地址

    2024年02月05日
    浏览(44)
  • C++ 银行家算法与时间片轮转调度算法结合

    声明:未经允许,请勿转载 一.实验目的 (1) 掌握 RR(时间片调度) 算法,了解 RR 进程调度 (2) 了解死锁概念,理解安全状态,并且理解银行家算法 (3) 利用 RR 进程调度与银行家算法结合,写出一个简单的项目 二.实验原理 2.1 时间片调度算法       在分时系统中都采用时间片轮

    2024年02月08日
    浏览(40)
  • 银行家算法——C++实现 [ 开源代码 + 详细解析 ]

    ✅ (原创,纯手敲,开源免费,2021的最后一篇) Banker Algorithm 🏦 ◆ 说明 :上述算法的核心实现采用了 “DFS + 回溯” 的方法,详见后文的源代码。另外,如果把 C++ 代码里面的 “ p_num=1; ” 注释掉,得到的是另一个结果。我虽然输入是“0”,但代码里后面我直接把 p_num 赋值

    2023年04月26日
    浏览(74)
  • 【操作系统原理实验】银行家算法模拟实现

    选择一种高级语言如C/C++等,编写一个银行家算法的模拟实现程序。1) 设计相关数据结构;2) 实现系统资源状态查看、资源请求的输入等模块;3) 实现资源的预分配及确认或回滚程序;4) 实现系统状态安全检查程序;5) 组装各模块成一个完整的模拟系统。 (1)设计思想: 1、

    2024年02月01日
    浏览(44)
  • 【操作系统】银行家算法个人出题例题 (含答案)

    1.银行家算法是代表性的避免死锁的算法,在进程调度中具有重要作用。请结合所学知识回答以下问题:(23分——加长版) (1)银行家算法使用的四个必要的数据结构是:可用资源向量Available,____________,分配矩阵Allocation,需求矩阵Need。(1分) (2)以下是银行家算法具体实现

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包