2.4_3 死锁的处理策略——避免死锁

文章目录

  • 2.4_3 死锁的处理策略——避免死锁
    • (一)什么是安全序列
    • (二)安全序列、不安全状态、死锁的联系
    • (三)银行家算法
  • 总结

2.4_3 死锁的处理策略——避免死锁

image-20240309132537751

  银行家算法是“避免死锁”策略的最著名的一个算法。

(一)什么是安全序列

  你是一位成功的银行家,手里掌握着100个亿的资金。

  有三个企业想找你贷款,分别是企业B、企业A、企业T,为描述方便,简称BAT。

  B表示:“我最多会跟你借70亿。”

  A表示:“我最多会跟你借40亿。”

  T表示:“我最多会跟你借50亿。”

  但是,有个规矩:如果你借给企业的钱总数达不到企业提出的最大要求,那么不管你之前给企业借了多少钱,那些钱都拿不回来了。

  刚开始,BAT三个企业分别从你这借了20、10、30亿。

image-20240309133835637

  显然,你手上还有40亿。


情况1

  手里还有40亿。

  此时,B还想借30亿,你敢借吗?假如我们借给他了,那么情况如下表。

image-20240309133954998

  由于刚刚手上还有40亿,且借给了B企业30亿,那么手上还有10亿。

  而由上表所示,如果BAT任何一个公司再借20亿,那么自己手上的10亿就满足不了他们的请求。又因为“如果你借给企业的钱总数达不到企业提出的最大要求,那么不管你之前给企业借了多少钱,那些钱都拿不回来了”的这个规矩,所以你最终借出去的所有钱都收不回来了。

  因此,在刚刚B向你再借30亿的时候,你就不应该借给他。即,给B借30亿是不安全的。


情况2

  手里还有40亿。

  此时,A还想借20亿,你敢借吗?假如我们借给他了,那么情况如下表。

image-20240309134349226

  由于刚刚手上还有40亿,且借给了A企业20亿,那么手上还有20亿。

  接下来,情况就比较乐观了,这个局就不是一个死局了。

  1.你可以先把20亿全部借给T,等T把钱全部还回来,手里就会有50亿,再把这些钱全部借给B,B还钱后就会有70亿,最后再借给A。

  2.或者,先借给A企业10亿,等A还钱,手里就有了50亿,再借给T企业20亿,等T还钱,手里就有了80亿,最后再借给B。

  即:“A还想再借20亿”是安全的,并且再借给A后,按照T ---> B ---> A的顺序借钱是可以的,而按照A ---> T ---> B的顺序借钱也是可以的。

(二)安全序列、不安全状态、死锁的联系

  经过分析,我们发现:有的资源请求是不能答应的,而有的资源请求是可以答应的。

不安全

image-20240309133954998

  给B借30亿是不安全的。借出之后手里只剩10亿,如果接下来BAT任何一个企业再借20亿,那么任何一个企业都得不到满足。就成为一个死局。

安全

image-20240309134349226

  给A借20亿是安全的,因为存在T ---> B ---> A这样的安全序列

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

  如果分配了资源以后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。

  如果系统处于安全状态(即,至少存在一个安全序列),就一定不会发生死锁。如果系统进入不安全状态(即,找不到任何一个安全序列),就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)。

  因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。

(三)银行家算法

  银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁

  接下来思考一下,怎么把这种用于银行系统的算法,运用到操作系统的避免死锁上面?

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

  思考:BAT的例子中,只有一种类型的资源——钱。但是在计算机系统中会有多种多样的资源(打印机、扫描仪、摄像头……),应该怎么把算法拓展为多种资源的情况呢?

  其实很简单,我们只需要把一维的数字(仅代表钱)拓展为多维的向量。

image-20240309142911667

  比如:系统中有5个进程P0-P4,3种资源R0-R2,初始数量为(10, 5, 7)。则某一时刻的情况可表示如下。

image-20240309142856629

  根据上表,此时已分配了(7, 2, 5),还剩余(3, 3, 2)

image-20240309143011154

  再根据“每个进程最多还需要”的数量,判断此时是否处于安全状态。

  问题:此时系统是否处于安全状态?

  方案:可以尝试着看看能不能找到一个安全序列。

  依次检查剩余可用资源(3, 3, 2)是否能满足各进程的需求。

  可满足P1需求,将P1加入安全队列,并更新剩余可用资源值为(5, 3, 2)

  经过从前到后的检查,首先发现P1进程可以满足。那么,我们优先把剩余资源分配给P1的话,P1是一定可以顺利结束的,而一旦P1顺利结束了,P1就会归还资源。于是,资源数就会增加到(2, 0, 0) + (3, 3, 2) = (5, 3, 2)

  依次检查剩余可用资源(5, 3, 2)是否能满足剩余进程(不包括已加入安全序列的进程,如下图所示)的需求。

  可满足P3需求,将P3加入安全序列,并更新剩余可用资源值为(7, 4, 3)

image-20240309234544230

  经过从前到后的检查(P1已加入安全序列,不检查P1),首先发现P3进程可以满足。那么,如果优先把资源分配给P3,P3一定是可以顺利执行结束的。等P3结束了就会归还资源。于是,资源数就会增加到(2, 1, 1) + (5, 3, 2) = (7, 4, 3)

  依次检查剩余可用资源(7, 4, 3)是否能满足剩余进程(不包括已加入安全序列的进程)的需求……

image-20240310001220590

  以此类推,共五次循环检查即可将5个进程都加入安全序列中,最终可得一个安全序列:{P1, P3, P0, P2, P4}

  该算法称为安全性算法。可以很方便地用代码实现以上流程,每一轮检查都从编号较小的进程开始检查。


  实际做题时可以更快速的得到安全序列。因为实际做题的时候是用笔算的,没必要按照代码逻辑执行的那么严谨。说明如下,

image-20240310001659110

  还是刚才的题。资源总数(10, 5, 7),此时系统剩余可用资源(3, 3, 2)

  如果从手算的视角来观察,经过对比,(3, 3, 2)可以给P1,也可以给P3。因此,可以一并将P1、P3都加入安全序列。同时,计算P1、P3归还资源之后的剩余资源值。更新剩余资源值为(2, 0, 0) + (2, 1, 1) + (3, 3, 2) = (7, 4, 3)

  因为,(3, 3, 2)如果能满足P1,那么待分配给P1,等P1使用完归还资源,这样之后,手上的剩余资源只会比(3, 3, 2)更多。因此一定能继续满足P3的使用。

  所以,当我们对于这种情况进行考虑时,就不需要考虑的这么麻烦。我们只需要考虑,把资源给P1、P3之后的情况,而不需要再机械的遵循代码运行逻辑。

image-20240310013114317

  同理,此时剩余资源(7, 4, 3),可以给P0、可以给P2、也可以给P4。因此,可以一并将P0、P2、P4都加入安全序列。同时,更新剩余资源值。

  于是,5个进程全部加入安全序列,说明此时系统处于安全状态,暂时不可能发生死锁了。


  再举一个“找不到安全序列”的例子。

image-20240310013323931

  首先,经过对比,(3, 3, 2)可满足P1、P3,因此可以把P1、P3加入安全序列。并更新此时剩余资源值为(2, 0, 0) + (2, 1, 1) + (3, 3, 2) = (7, 4, 3)

image-20240310013900356

  继续对比,对于剩下的进程,P0、P2、P4都得不到完全满足(向量中的各个分量,只要有一个得不到满足,就无法满足)。

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


如何用代码实现银行家算法

  假设系统中有n个进程,m种资源

  每个进程在运行前先声明对各种资源的最大需求数,则可用一个n * m的矩阵(可以用二维数组实现)表示所有进程对各种资源的最大需求数。不妨称之为最大需求矩阵Max。在矩阵中,每个元素Max[i, j] = k表示进程Pi最多需要k个资源Rj

  系统还需要记录“此时已经给每个进程分配了多少资源”。同理,可以使用一个n * m分配矩阵Allocation表示对所有进程的资源分配情况。

  至于每个进程“最多还需要多少资源”,我们只需使用Max - Allocation即可,并同样使用一个二维矩阵保存之。不妨称之为Need矩阵,表示各进程最多还需要多少各类资源。

  此外,还需要记录“系统中剩余资源的数量”。对此,我们使用一个一维数组即可。可以使用一个长度为m的一维数组Available表示当前系统中还有多少可用资源。

  当某进程Pi向系统申请资源时,可用一个长度为m的一维数组Requesti表示本次申请的各种资源的数量。

image-20240310021048279

  各个数据结构都已设置好,接下来考虑如何进行操作。

  可用银行家算法预判本次分配是否会导致系统进入不安全状态:

  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.长度为m的一维数组Available表示还有多少可用资源;

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

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

  4.Max - Allocation = Need矩阵表示各进程最多还需要多少资源;

  5.用长度为m的一维数组Requesti表示进程此次申请的各种资源数。

银行家算法步骤

  1.检查此次申请是否超过了之前声明的最大需求数;

  2.检查此时系统剩余的可用资源是否还能满足这次请求;

  3.试探着分配,更改各数据结构;

  4.用安全性算法检查此次分配是否会导致系统进入不安全状态。

安全性算法步骤

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

  不断重复上述过程,看最终是否能让所有进程都加入安全序列。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch架构原理

一. Elasticsearch架构原理 1、Elasticsearch的节点类型 在Elasticsearch主要分成两类节点&#xff0c;一类是Master&#xff0c;一类是DataNode。 1.1 Master节点 在Elasticsearch启动时&#xff0c;会选举出来一个Master节点。当某个节点启动后&#xff0c;然后使用Zen D…

时间感知自适应RAG(TA-ARE)

原文地址&#xff1a;Time-Aware Adaptive RAG (TA-ARE) 2024 年 3 月 1 日 介绍 随着大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;出现了新兴能力的概念。前提或假设是LLMs具有隐藏的和未知的能力&#xff0c;等待被发现。企业家们渴望在LLMs中发现一些无人知晓…

论文笔记 - 基于振动信号的减速器故障诊断方法

1.论文摘要 基于振动信号的减速器故障诊断方法, 沈晴,《起重运输机械》,2018 原作者联系方式: shenqing@zmpc.com 这篇文章包含了一个从工程到数据处理和故障定位的完整过程。是一篇综述文档。它介绍了机械设备常见的三类故障(轴,齿轮、轴承)的故障特征,并在一个故障追…

指针数组和数组指针(详细解释)

指针数组 指针数组的作用 指针数组和数组指针是C语言中常用的概念&#xff0c;它们分别有不同的作用和用法。 指针数组&#xff1a; 指针数组是一个数组&#xff0c;其中的每个元素都是指针类型。它可以用来存储多个指针&#xff0c;每个指针可以指向不同的数据类型或者相同…

xxl-job学习记录

1、应用场景 例&#xff1a; 某收银系统需要在每天凌晨统计前一天的财务分析、汇总 某银行系统需要在信用卡还款日前三天发短信提醒等 2、为什么需要使用任务调度 spring中提供了注解Scheduled的注解&#xff0c;这个注解也可以实现定时任务的执行 我们只需要在方法上使用这…

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、 省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

数字化转型导师坚鹏:科技金融政策、案例及数字化营销

科技金融政策、案例及数字化营销 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技金融有哪些利好政策&#xff1f; 不知道科技金融有哪些成功案例&#xff1f; 不知道科技金融如何数字化营销&#xff1f; 课程特色&#xff1a; 以案例的方式解读原…

【个人开发】llama2部署实践(二)——基于GPU部署踩坑

折腾了一整天&#xff0c;踩了GPU加速的一堆坑&#xff0c;记录一下。 1.GPU加速方式 上篇已经写了llama2部署的大概流程&#xff1a;【【个人开发】llama2部署实践&#xff08;一&#xff09;】——基于CPU部署 针对llama.cpp文件内容&#xff0c;仅需再make的时候带上参数…

数字建筑欢乐颂,智慧工地共筑美好未来!

在解决农民工人欠薪这一长期困扰建筑业的难题上&#xff0c;某建筑公司响应政策&#xff0c;严格按照实名制管理&#xff0c;实施过程中发现并克服了传统管理模式的痛点&#xff1a;聊天群组的信息时&#xff0c;往往会被淹没在“收到”回复中&#xff0c;影响沟通效率&#xf…

探索React中的类组件和函数组件

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

每日一题leetcode-找出数组的第K大和

一.题目解析 读完题目后我们知道&#xff0c;该题就是让我们在子序列中求和&#xff0c;我们要在不同的子序列中排序找到第K大的和。何为子序列&#xff1f; 子序列就是在一个数组中抽出一些元素构成一个新的数组即可&#xff0c;不要求一定是连续的&#xff1b; 例如&#x…

深入解析汽车MCU的软件架构

一、背景知识 电动汽车&#xff08;EV&#xff09;正在成为首选的交通方式&#xff0c;为传统内燃机汽车提供了一种可持续发展的环保型替代方案。在电动汽车复杂的生态系统中&#xff0c;众多电子控制单元&#xff08;ECU&#xff09;在确保其高效运行方面发挥着至关重要的作用…

《IAB视频广告标准:综合指南(2022)》之概述篇 - 我为什么要翻译介绍美国人工智能科技公司IAB 系列(2)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

最优算法100例之03-判断是否是栈的弹出序列

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例…

20、电源管理入门之Hypervisor中的电源管理

目录 1. Hypervisor概念介绍 2. 汽车软件中的Hypervisor应用 3. QNX Hypervisor 4. Hypervisor中的多OS通信技术 5. 电源管理相关 参考: 很多时候听说Hypervisor,但是对底层软件技术不了解的人感觉挺神秘。本篇文章简单介绍下Hypervisor的基本概念,另外介绍下电影管理…

从零开始:神经网络(2)——MP模型

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 神经元相关知识&#xff0c;详见从零开始&#xff1a;神经网络——神经元和梯度下降-CSDN博客 1、什么是M-P 模型 人…

《剑指 Offer》专项突破版 - 面试题 76 : 数组中第 k 大的数字(C++ 实现)

目录 详解快速排序 面试题 76 : 数组中第 k 大的数字 详解快速排序 快速排序是一种非常高效的算法&#xff0c;从其名字可以看出这种排序算法最大的特点是快。当表现良好时&#xff0c;快速排序的速度比其他主要对手&#xff08;如归并排序&#xff09;快 2 ~ 3 倍。 快速排…

浏览器与Node.js事件循环:异同点及工作原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

记一次项目所学(中间件等)-动态提醒功能(RocketMQ)

记一次项目所学(中间件等&#xff09;–动态提醒功能&#xff08;RocketMQ&#xff09; 订阅发布模式与观察者模式 RocketMQ&#xff1a;纯java编写的开源消息中间件 高性能低延迟分布式事务 Redis : 高性能缓存工具&#xff0c;数据存储在内存中&#xff0c;读写速度非常快 …