2.4_4 死锁的检测和解除

文章目录

  • 2.4_4 死锁的检测和解除
    • (一)死锁的检测
    • (二)死锁的解除
  • 总结

2.4_4 死锁的检测和解除

image-20240310130016505

  如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供两个算法:

  1.死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁。

  2.死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来。

(一)死锁的检测

  为了能对系统是否已发生了死锁进行检测,必须:

  1.用某种数据结构来保存资源的请求和分配信息;

  2.提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

image-20240310130651129

image-20240310130823583

  注:如果学习过数据结构中的“图”,则可以尝试着具体定义一下这个数据结构。

  如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。

  例如上图中的进程P1,它申请了1个R2资源,此外,R2资源此时分配了1个给P2进程。所以,P1进程对于R2资源的请求是可以被满足的,不会被阻塞,可以顺利执行下去。

  但是,对于P2进程请求R1来说,由于此时R1资源已经分配出去了2个给P1、1个给P2,那么P2对于R1资源再次的请求1个,就无法被满足。

  如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。

  刚才说了,P1对于R2资源的请求是可以顺利执行的。那么等到P1执行完毕,就会归还它所使用的资源。

  :某个进程在进行请求资源、使用完毕、归还资源之后,该进程所对应的“请求边”、“分配边”就可以从图中删去,如下图所示。

image-20240310131504901

  刚刚我们说了,P2对于R1资源的请求是无法满足、阻塞的。然而,当此时P1归还系统资源后,R1资源的数量又足够满足P2了,因此P2就会被唤醒,并正常执行。

  同理,等P2执行完之后,它也会归还所有的资源。所以,我们也可以把P2相连的边全部删去,如下图所示。

image-20240310131658586

  如果按上述过程分析,最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列)。

  其本质其实和上一小节银行家算法的过程是一致的。我们经过比对,发现P1能够满足,于是把P1加入安全序列,让P1执行,执行完毕归还资源。归还资源后,我们再次经过比对,发现P2能够满足,于是把P2加入安全序列,让P2执行……

  如果最终不能消除所有边,那么此时就是发生了死锁

  最终还连着边的那些进程就是处于死锁状态的进程


例子

image-20240310132113753

  如图。此时,可以顺利执行的,只有P3进程。当P3执行完毕之后,归还资源。

image-20240310132212631

  此时,可以发现,P1想要申请R2资源,但无法满足,因此P1会被阻塞;P2想要申请R1资源,但无法满足,因此P2也会被阻塞。

  我们无法消除这些边,系统发生了死锁。


检测死锁的算法

  1.在资源分配图中,找出既不阻塞又不是孤点的进程Pi。消去它所有的请求边和分配边,使之成为孤立的结点。在下图中,P1是满足条件的进程结点,于是将P1的所有边消去。

  “不阻塞”的意思是,这个进程申请的资源数量足够满足它的需求,比如像P1进程就是不阻塞的进程,而P2进程就是阻塞的进程。

  “孤点”的意思是,这个图中,没有任何边与这个结点相连,则这个结点就是孤点。下图中,P1、P2此时都不是孤点。

  因此,此时满足“既不阻塞、又不是孤点”的进程,就是P1进程。

image-20240310132945411

  2.进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。在下图中,P2就满足这样的条件。同理,依旧按照“1”中的处理逻辑对其进行简化。

  按照第1步中的逻辑,进行同样的操作。在下图中,“既不阻塞、又不是孤点”的进程就是P2,我们消去它所有的请求边和分配边即可。

image-20240310133106785

  最终,若能消去图中所有的边,则称该图是可完全简化的

image-20240310133325679

  死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

  至此,我们已经解决了第一步问题——我们已经可以有办法检测出“系统是否发生了死锁”。

  接下来,我们就可以想办法——“怎么解除死锁”。

(二)死锁的解除

  一旦检测出死锁的发生,就应该立即解除死锁。

  注意:系统中有死锁的发生,并不代表着系统中所有的进程都是死锁状态。我们在用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程


解除死锁的主要方法

  1.资源剥夺法

  挂起(即暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。

  注意:既然“挂起某些死锁进程”,那么我们要挂起的进程就不能是非死锁进程。如下图,此时P1、P2处于死锁,而P3并不是死锁。因此我们就不能挂起P3,而只能挂起P1或者P2。

image-20240310133803975

  2.撤销进程法(或称终止进程法

  强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓是功亏一篑,以后还得从头再来。

  3.进程回退法

  让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

  如上图中,对于P1进程,我们可以让它回退到“P1只持有1个R1资源”的时候。回退到此,便能够保证P2进程顺利执行下去,从而解决死锁问题。

思考:如何决定“对谁动手”

  即,无论使用上述三种方法中的哪一种,总之,我们要对哪个死锁进程下手?或者说,让哪个进程做出牺牲?——剥夺它的资源 / 终止它 / 回退它。

  可以从以下这些角度来做出考虑。

  1.进程优先级。

  优先级低的,我们可以对它下手。

  2.已执行多长时间。

  执行时间越长,说明对它下手,所付出的代价可能会更大。所以我们可以选择“已执行时间”更短的进程。

  3.还要多久能完成。

  对于“马上就能完成了”的资源,我们可以保证它的继续运行,转而去牺牲别的进程。

  4.进程已经使用了多少资源。

  如果一个进程已经拥有了很多资源的话,那么我们把它剥夺,就会释放出很多资源,从而让原本死锁的局面最大程度地得到缓解。因此,我们可以对“此时拥有资源最多”的进程下手。

  5.进程是交互式的还是批处理式的。

  “交互式”就意味着这个进程当前是正在与用户进行交互的。如果对交互式进程下手,把它干掉的话,那么用户体验就会变差。

  而对于批处理式的进程,它只是计算机自身在进行一系列的处理,而用户对它的反馈并不那么在意。所以我们可以优先对“批处理进程”下手。

总结

image-20240310135017294

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

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

相关文章

sql-mysql可视化工具Workbench导入sql文件

mysql可视化工具Workbench导入sql文件 1、打开workbench2、导入sql文件3、第一行加上库名4、开始运行 1、打开workbench 2、导入sql文件 3、第一行加上库名 4、开始运行

【图(1)】:用邻接矩阵和邻接表实现图

目录 一、图的基本概念 二、图的存储结构 1.邻接矩阵 2.邻接表 一、图的基本概念 注意:概念性的文字不列出太多,记不住也不便于理解 图(Graph)是由节点(Node)和边(Edge)组成的…

Vue 监听器:让你的应用实时响应变化

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

CSS居中对齐 (水平垂直居中对齐)

方案一&#xff1a;flex布局【推荐】 给容器添加样式 display: flex; justify-content: center; align-items: center; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" conte…

第三百九十六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍显示Snackbar的另外一种方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1…

算法-贪心-122. 糖果传递

题目 有 n个小朋友坐成一圈&#xff0c;每人有 a[i]个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正整数 n&#xff0c;表示小朋友的个数。 接下来 n 行&#xff0c;每行一个整数…

【组合递归回溯】【StringBuilder】Leetcode 17. 电话号码的字母组合

【组合递归回溯】【StringBuilde】Leetcode 17. 电话号码的字母组合 StringBulider常用方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;17…

JavaScript实现通过键盘弹钢琴的效果

本片文章通过触发键盘事件来触发对应的音乐&#xff0c;而且给页面添加了渐变的active类名&#xff0c;通过触发不同的鼠标事件&#xff0c;然后active类移动来实现按下钢琴键的视觉效果。 关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><h…

十堰网站建设公司华想科技具有10年的网站制作经验

2018年已经结束了。 华翔科技收到了很多客户的咨询&#xff0c;他们都有一个共同的问题&#xff1a;建一个网站需要多少钱&#xff1f; 但是&#xff0c;我们都会问&#xff1a;您有什么具体需求吗&#xff1f; 大多数人的答案是否定的&#xff0c;他们只是想打听一下价格。 十…

嵌入式3-11

1、整理思维导图 2、尝试学生结构体数组&#xff0c;完成成员的输入&#xff0c;以成绩为条件完成对学生成员的冒泡排序并输出&#xff08;全部在主函数内完成&#xff09; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.…

25改考408最新资讯!拷贝

东北大学 东北大学计算机考研全面改考408 东北大学计算机学院官网&#xff1a;http://www.cse.neu.edu.cn/6274/list.htm 东北大学计算机考研全面改考408 公告原文 东北大学计算机科学与工程学院关于调整2025年硕士研究生招生计算机科学与技术、计算机技术、人工智能专业初试…

【JAVA类】利用接口的多继承实现———图书管理系统【附源码】

引言 在我们学习了一些java的基础语法之后&#xff0c;需要把这些知识点可以串起来&#xff0c;这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点&#xff0c;今天就带大家学习一个有关java的小项目&#xff0c;很多学校也经常把这个项目作为他们的课程设计——经典的…

从零学习Linux操作系统 第三十二部分 Ansible中的变量及加密

一、变量的基本设定及使用方式 变量命名&#xff08;与shell相同&#xff09;&#xff1a; 只能包含数字&#xff0c;下划线&#xff0c;字母 只能用下划线或字母开头 .变量级别&#xff1a; 全局从命令行或配置文件中设定的paly:在play和相关结构中设定的主机:由清单&…

基于 Win Server 2008 复现 IPC$ 漏洞

写在前面 本篇博客演示了使用 winXP&#xff08;配合部分 win10 的命令&#xff09;对 win server 2008 的 IPC$ 漏洞进行内网渗透&#xff0c;原本的实验是要求使用 win server 2003&#xff0c;使用 win server 2003 可以规避掉很多下面存在的问题&#xff0c;建议大家使用 …

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

TCP多线程模型、IO模型(select、poll、epoll)

我要成为嵌入式高手之3月11日Linux高编第十九天&#xff01;&#xff01; ———————————————————————————— TCP并发模型 一、TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够现的并发量比较有限 二、IO模型&…

【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据

一、前言 之前写过两篇PHP实现与硬件串口交互的文章&#xff0c;一篇是【PHP】PHP实现与硬件串口交互&#xff0c;接收硬件发送的实时数据&#xff08;上&#xff09;_php串口通信-CSDN博客&#xff0c;另一篇是【PHP】PHP实现与硬件串口交互&#xff0c;向硬件设备发送指令数…

HarmonyOS NEXT应用开发之图片缩放效果实现

腾讯T10级高工技术&#xff0c;安卓全套VIP课程全网免费送&#xff1a;https://docs.qq.com/doc/DSG1vYnRxSElnU3hE 学习鸿蒙开发势在必行。鸿蒙开发可参考学习文档&#xff1a;https://qr21.cn/FV7h05 介绍 图片预览在应用开发中是一种常见场景&#xff0c;在诸如QQ、微信、…

Facebook商城号为什么被封?如何防封?

由于Facebook商城的高利润空间&#xff0c;越来越多的跨境电商商家注意到它的存在。Facebook作为全球最大、用户量最大的社媒平台&#xff0c;同时也孕育了一个巨大的商业生态&#xff0c;包括广告投放、商城交易等。依托背后的大流量&#xff0c;Facebook商城起号较快&#xf…

GPU,一统天下

三十年前&#xff0c;CPU 和其他专用处理器几乎处理所有计算任务。那个时代的显卡有助于加快 Windows 和应用程序中 2D 形状的绘制速度&#xff0c;但没有其他用途。 快进到今天&#xff0c;GPU 已经成为业界最具主导地位的芯片之一。 但具有讽刺意味的是&#xff0c;图形芯片…