银行家算法
W. Dijkstra的银行家算法是一种避免死锁的算法。命名原因是该算法原本为银行设计,确保银行发放贷款时,不会发生不能满足全部客户的需求的情况。
1、银行家算法需要的数据结构
设1个CPU核心上有:
s个进程。进程向量
P ⃗=(p,p_2,…,p_s)
t种空闲资源。空闲资源向量
F ⃗=(f_1,f_2,…,f_t)
最大需求矩阵
M =(m_i ,j )(s×t)
m_i ,_j表示:第i个进程p_i在运行过程中需要j种资源的最大数量。
分配矩阵
A=(a_i ,j )(s×t)
a_i ,_j表示:进程p_i已经分配到资源j的数量。
需求矩阵
N=(n_i ,j )(s×t)
n_i ,_j表示:进程p_i在对资源j的需求最大的时刻,仍然需要分配的资源j的数量。
不难看出
∀i∈{1,…,s}, j∈{1,…,t}, n_i ,_j=m_i ,_j-a_i ,_j
2、银行家算法的步骤
设现在开始向进程p_i尝试分配需要的资源。进程p_i需要的每种资源的数量用请求向量R_i=(r_i ,_1,〖 r〗_i ,_2,…, r_i ,_t)表示。
银行家算法的步骤是:
【1】如果r_i ,_j≤n_i ,_j,则跳至【2】;否则报错,因为进程p_i需要的资源用量超过原先已知的最大值。
【2】如果r_i ,_j≤a_i ,_j,则跳至【3】;否则,当前可用资源不足,进程p_i需要等待,或尝试为另一个进程分配资源。
【3】系统开始尝试将资源分配给进程p_i。先修改如下的值:
F ⃗_j-=r_i ,_j
a_i ,_j+=r_i ,_j
n_i ,_j-=r_i ,_j
注:因为要模拟满足该进程的请求后,该进程及其它进程剩余的资源获取请求是否依然能满足,所以上述三条表达式中的第1、第3条是必须的;第2条可以移到【4】中执行,但安全性算法中也需要相应修改。
【4】执行安全性算法。若安全,则正式将资源分配给进程p_i(即:在完成【3】的基础上继续);否则,撤销【3】(即尝试分配作废,进程p_i继续等待)。
3、安全性算法
【1】设:工作向量
W ⃗=F ⃗
其长度为t,用于模拟资源分配后各个资源剩余的数量。
完成向量
C ⃗=(0, 0,…, 0)
其长度为s,用于在模拟中标记一个进程在资源需求最高时是否仍能顺利获得所需资源并完成。进程未完成和完成分别标记0和1。
【2】在s个进程中,任选一个进程p_i能满足
c_i=0
n_i ,_j≤w_i ,_j
若找到,跳至【3】;否则,跳至【4】。
【3】找到了【2】中所描述的进程,意味着剩余资源数量可以满足该进程的最大需求,并供该进程运行至完成。该进程在完成后释放它占有的全部资源:
w_j+=a_i ,_j
c_i=1
【4】如果s个进程全部完毕,即C ⃗的每一项均为1,则系统处于安全状态;否则,系统处于不安全状态。
系统处于安全状态,意味着存在一个序列
{〖P_k〗_1,…,〖P_k〗_s }, k_1,…,k_s 是1,2,……,s的一个全排列
使得:按照该顺序为s个进程分配所需资源,且每个进程都在上一个进程结束后才继续,则能够保证所有进程都可以顺利结束,不会产生死锁。

银行家算法并不是普适性的算法。它只在少数领域有用,例如只运行特定任务、对每个运行任务的行为都知根知底的一些嵌入式系统。总之,死锁一般是不可完全避免的。各种预防、避免死锁的方法都有其弊端。具体采用哪些方案,应当结合操作系统面对的应用环境来决定。

【梳理】简明操作系统原理:银行家算法(内附文档高清截图)相关推荐

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

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

  2. 操作系统之银行家算法解析

    操作系统之银行家算法解析(带例题) 利用银行家算法避免死锁,首先我们先来明晰一下银行家算法的数据结构,其中必须设置四个数据结构,Available,Max,Allocation,Need. Avail ...

  3. 利用Python3内置文档资源高效学习及官方中文文档

    概述 从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串.列表.字典等数据结构的内置方法,和大量内置的标准库,诸如functools.time.thr ...

  4. NLP之TM之LDA:利用LDA算法瞬时掌握文档的主题内容—利用希拉里邮件数据集训练LDA模型并对新文本进行主题分类

    NLP之TM之LDA:利用LDA算法瞬时掌握文档的主题内容-利用希拉里邮件数据集训练LDA模型并对新文本进行主题分类 目录 输出结果 设计思路 核心代码 训练数据集 LDA模型应用 输出结果 设计思路 ...

  5. MongoDB进阶-内嵌文档查询

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded), ...

  6. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】

    一.介绍 MONGODB 的表结构 很灵活 .主要还是因为 字段中可以包含 [ 数组].[内嵌文档]. 现在简单介绍一下 字段中的[ 数组].[内嵌文档]相关的一些操作 (为了方便理解,还是以表来理解 ...

  7. MongoDB内置文档查看和修改

    MongoDB设计的时候,有时候会设计内置文档,方便某个对象的统一.在这里略写了查看内置文档和更新内置文档. 1.查看  表为:realtimelogin   realName为:123 realpa ...

  8. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

  9. java mongo 查询数组_MongoDB查询(数组、内嵌文档)

    一.简介 我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是 ...

最新文章

  1. 广东java工资一般多少_广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少...
  2. java 为什么需要常量池
  3. RocketMQ 一行代码造成大量消息丢失
  4. 一次性讲清 Spring 常用注解 @Bean 、 @Component 、@Autowire、@Resource 的区别, 你知道吗?
  5. JDK 14 调试神器了解一下?
  6. 一周学C#第五天——命名空间
  7. ADO.NET常用对象详解之:DataAdapter对象
  8. Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
  9. 网站开发流程以及HTML5简介(七)
  10. 指针01:指针的定义与使用
  11. 米家扩展程序初始化超时_一套完整的PLC程序是什么样子
  12. 重读《JavaScript DOM编程艺术》(第一版)
  13. c# MVC在WEB.Config中配置MIME
  14. 《Python机器学习——预测分析核心算法》——2.3 对“岩石vs.水雷”数据集属性的可视化展示...
  15. 实部和虚部高斯变量瑞利衰落matlab,瑞利信道仿真
  16. python写的ROS激光雷达扇形滤波
  17. OLED屏幕的手机和LCD屏幕的手机,到底哪个好?
  18. 【杂谈】仿生人会梦见电子羊吗?
  19. Linux系统配置网卡ip地址
  20. threeJs学习随笔(一),附百度网盘下载地址

热门文章

  1. 正交最小二乘法求解NARMAX
  2. https网站请求下载http的资源会被拦截
  3. RK3399+FPGA+MIPI 方案细节之subLVDS to MIPI处理
  4. Hbuilder X 配置Git、SVN项目管理工具
  5. feign.RetryableException: too many bytes written executing POST
  6. CorelDRAW最新24.1.0.360版本更新介绍讲解
  7. C语言判断一个数是否为素数(质数),C语言经典例题计算素数,C语言二级重点
  8. 中国全国地区MYSQL 地区SQL数据表(省,市,区,县)
  9. 计算机网络(二十二):虚电路和数据报网络
  10. 五分钟学GIS | 多进程切图