[操作系统] 银行家算法
文章目录
- 安全序列
- 通俗理解模型
- 初始借完钱
- 分析借钱的安全序列
- 银行家算法
- 核心思想
- 资源表示
- 安全性算法分析系统状态
- 银行家算法实现
- 思路分析
- 银行家算法步骤
- 安全性算法步骤
- 升华思维
安全序列
如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。
当然,安全序列可能有多个
。
通俗理解模型
此时你是一位成功的银行家,手里有100亿资金…
此时有三个企业想找你贷款,分别是企业B,企业A,企业T
B:“大哥,我最多要借70亿”
A:“大哥,我最多要借40亿”
T:“大哥,我最多要借50亿”
有个规矩:借给企业的钱达不到企业提出的最大要求,那么你借的钱就打水漂了
当然你也不想你的钱打水漂,那么就要考虑 怎么借才能保证自己的100亿不打水漂
初始借完钱
最大要求 | 已经借走 | 最多再借 | |
---|---|---|---|
B | 70 | 20 |
50
|
A | 40 | 10 |
30
|
T | 50 | 30 |
20
|
此时你手里还有40亿
…
分析借钱的安全序列
此时B想跟你借30亿,你敢借吗?
假如你答应了:借给了B 30亿,
那么你的手里还有10亿
,上面的图稍作修改,如下图:最大要求 已经借走 最多再借 B 70 20 +30=50
50 -30=20
A 40 10 30
T 50 30 20
如果其他企业再提出借20亿,那你巴比Q了,显然你借不了,你的钱打水漂了,所以这个钱不能借。
不安全
此时A想跟你借20亿,你敢借吗?
假如你答应了:借给了A 20亿,
那么你的手里还有20亿
,上面的图稍作修改,如下图:最大要求 已经借走 最多再借 B 70 20 50
A 40 10 +20=30
30-20=10
T 50 30 20
接下来你可以把这20亿都借给T企业。等他把钱全部还回来了,手里就有50亿,再把这些钱借给B企业。等他把钱全部还回来了,手里就有70亿,最后再借给A企业。这样你的钱就全回来了。
所以此借钱序列(安全序列):T->B->A
根据上述思路自行验证这个序列: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)
安全性算法分析系统状态
此时系统是否处于一种安全状态?若是,则找出一条安全序列。
首先,检查剩余的资源是否满足各个进程的需求
我们发现能满足P1、P3的需求。那先分配给P1(将P1加入安全序列),等待他结束,那么剩余资源将变为(5,3,2);再分配给P3(将P3加入安全序列),等他结束,剩余资源将变为(7,4,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)
将P4、P2、P0(他们最多需要的资源数小于剩余资源)加入安全序列,最终可得到一个安全序列。
安全性算法
实际做题(手算)的情况下可用更快速的方法找到一个安全序列
- (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, 3, 2) 可满足 P1、 P3, 说明无论如何, 这两个进程的资源需求一定是可以依次被满足的, 因此P1、 P3 一定可以顺利的执行完, 并归还资源。 可把 P1、 P3 先加入安全序列。(2, 0, 0) + (2, 1, 1) + (3, 3, 2) = (7, 4, 3)
特殊:找不到安全序列的列子
进程 最大需求 已经分配 最多需要 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)
资源总数(10,5,7),剩余可用资源(3,3,2)
(3, 3, 2) 可满足 P1、 P3,可把 P1、 P3 先加入安全序列,剩余可用资源(7, 4, 3)
进程 最大需求 已分配 最多还需要 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)
剩下的无法满足,每一位对比。剩下的 P0 需要 (8, 4, 3)
(7, 4, 3)
P2 需要 (6, 5, 0)(7, 4, 3)
P4 需要 (4, 3, 4)无法找到任何一个安全序列, 说明
此时系统处于不安全状态, 有可能发生死锁
下面进入正题:银行家算法的实现
银行家算法实现
进程 | 最大需求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) ]
思路分析
如果 Requesti[j]≤Need[i, j] (0≤j≤m)便转向
2
; 否则认为出错 :因为它所需要的资源数已超过它所宣布的最大值
如果 Requesti[j]≤Available[j] (0≤j≤m), 便转向
3
; 否则表示尚无足够资源, Pi必须等待系统试探着把资源分配给进程Pi, 并修改相应的数据(
并非真的分配, 修改数值只是为了做预判
)Available = Available - Requesti; Allocation[i, j] = Allocation[i, j] + Requesti[j]; Need[i, j] = Need[i, j] – Requesti[j]
操作系统执行
安全性算法
, 检查此次资源分配后,系统是否处于安全状态
。 若安全, 才正式分配; 否则, 恢复相
应数据, 让进程阻塞等待
银行家算法步骤
- 检查此次申请是否超过了之前声明的最大需求数
- 检查此时系统剩余的可用资源是否还能满足这次请求\
- 试探着分配, 更改各数据结构
- 用安全性算法检查此次分配是否会导致系统进入不安全状态
安全性算法步骤
检查当前的剩余可用资源是否能满足某个进程的最大需求, 如果可以, 就把该进程加入安全序列,并把该进程持有的资源全部回收。
不断重复上述过程, 看最终是否能让所有进程都加入安全序列。
系统处于不安全状态未必死锁, 但死锁时一定处于不安全状态。 系统处于安全状态一定不会死锁
升华思维
死锁预防是保证系统不进入死锁状态的静态策略,其解决办法是破坏产生死锁的四个必要条件之一、下列方法中 破坏了“循环等待”条件的是( )。
A. 银行家算法
B. 一-次性分配策略
C. 剥夺资源法
D. 资源有序分配策略
产生死锁的四个必要条件:互斥、不剥夺、请求和保持、循环等待
资源有序分配策略可以限制循环等待条件的发生。选项A判断是否为不安全状态;选项B破坏了占有请求条件;选项C破坏了非剥夺条件。
某系统中有三个并发进程都需要四个同类资源,则该系统必然不会发生死锁的最少资源是( )。
A. 9
B. 10
C. 11
D. 12
资源数为9时,存在三个进程都占有三个资源,为死锁;资源数为10 时,必然存在一个进程能拿到4个资源,然后可以顺利执行完其他进程。
A. Ⅱ、Ⅲ
B. Ⅰ、Ⅱ
C. Ⅰ
D. Ⅰ、Ⅲ
[操作系统] 银行家算法相关推荐
- 操作系统——银行家算法(银行家和房地产开发商的爱恨情仇)
操作系统--银行家算法 什么是银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避 ...
- 操作系统银行家算法计算机四级,【NCRE四级网络工程师】操作系统多选题
友情提示:此篇文章大约需要阅读 7分钟54秒,不足之处请多指教,感谢您的阅读. 保存在进程控制块中的是 进程标识符 进程当前状态 代码段指针 PCB的内容可以分为调度信息和现场信息两大部分.调度信息供 ...
- 操作系统 | 银行家算法及代码实现
参考博客 [操作系统]死锁避免之银行家算法_少侠露飞的学习笔记-CSDN博客 [操作系统]避免死锁--银行家算法_明昕ztoy的博客-CSDN博客_银行家算法避免死锁 实现思路 当一个进程申请使用资源 ...
- 操作系统-银行家算法(Java实现)
一.银行家算法思想 银行家算法是最著名的死锁避免算法,其思想是:将操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款.操作系统按照银行家制定 ...
- c语言银行家算法模拟程序,C语言实现 操作系统 银行家算法
/**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin, 可能存在多类资 ...
- 银行家算法 计算机操作系统,计算机操作系统 银行家算法.doc
银行家算法 //breaker.h文件代码 #include using namespace std; int Test_Request(int *,int *); //测试函数 void Assig ...
- 计算机操作系统——银行家算法
1.实验目的: 银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法.本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁.产生死锁的必要条件.安全状态等重要概念,并掌握 ...
- 操作系统 银行家算法及相关例题
银行家算法 Dijkstra的银行家算法是最具有代表性的避免死锁的算法,这个算法因能用于银行系统现金贷款的发放而得名. 安全状态 所谓安全状态,是指系统能按某种进程顺序(P1,P2,-,Pn)(称&l ...
- 操作系统——银行家算法的模拟实现
一.实验目的 (1)理解银行家算法. (2)掌握进程安全性检查的方法与资源分配的方法. 二.实验内容与基本要求 编制模拟银行家算法的程序,并给出一个例子验证所编写的程序的正确性. 要求例子中包含分配安 ...
最新文章
- 麻省理工学院开放 2018 自动驾驶课程
- 【模型解读】从LeNet到VGG,看卷积+池化串联的网络结构
- db2 最大分区数_db2 查询表分区数据库
- win创建linux目录,Windows与Linux上的文件创建时间
- c语言面试会问10个数排序吗,c语言面试最必考的十道试题,求职必看!!!
- bug-android之INSTALL_FAILED_NO_MATCHING_ABIS
- 类似GoogleMap地图网站的简单实现(1)
- 医疗健康领域的短文本解析探索----文本纠错
- Spring已集成jsp的环境下同时集成Velocity
- Java 百度OCR 身份证识别
- 基于Halcon学习的二维码识别【六】pdf417_bottle.hdev
- 对于三极管饱和状态的一些浅见——与网友的讨论贴
- 苹果Mac删除windows后无法合并分区的简单解决方法
- oracle中number的用法,Oracle Number数字
- 服务器磁盘配置信息,服务器磁盘阵列配置
- Java Attach机制
- 解决Chrome、Safair、Webkit等内核浏览器默认文本域和文本
- DNS无法解析IP_DNS之基本原理
- SQL员工基本工资表题目及答案
- 小小白的Android入门之计算器学习