操作系统——死锁(一文详解死锁,死锁产生的原因和死锁的解决方案)

1、什么是死锁?死锁产生的条件?

1.1、什么是死锁?

答: 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态

1.2、死锁产生的四个必要条件?

  • 互斥条件: 一个资源一次只能被一个进程使用;
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放
  • 不剥夺条件: 进程获得的资源,在未完全使用完之前,不能强行剥夺;
  • 循环等待条件: 若干进程之间形成一种头尾相接的环形等待资源关系。

1.3、如何处理死锁问题?

  • 忽略该问题:例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像;
  • 检测死锁并且恢复;
  • 仔细地对资源进行动态分配,以避免死锁
  • 通过破除死锁四个必要条件之一,来防止死锁产生。

2、死锁的解决办法

  • 预防死锁: 通过破坏死锁四个必要条件之一,来防止死锁产生;
  • 避免死锁: 在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁;
  • 检测死锁: 允许进程在运行过程中发生死锁,但是可以通过检测机构及时检测出死锁,然后通过合适的措施,把进程从死锁过程中解脱出来;
  • 解除死锁: 当检测系统中已经发生死锁时,就采用相应措施,将进程从死锁状态中解脱出来。
  • 忽略死锁: 比如:鸵鸟算法,当系统发生死锁时不会对用户造成多大影响,或系统很少发生死锁的场合。

3、预防死锁

3.1、破坏“不抢占”条件

答:当某个进程请求新的资源得不到满足时,便立即释放保持的所有资源,待以后需要时再重新申请。

缺点是实现复杂,抢占资源可能导致部分工作失效,反复申请和释放导致系统开销很大,也可能导致饥饿。

3.2、破坏“请求和保持”条件

答:我们必须保证:当一个进程在请求资源时,它不能持有不可抢占的系统资源。在此,有两种协议可供选择:

  • 第一种协议: 该协议规定,所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。此时若系统有足够的资源分配给某进程,便可把其需要的所有资源分配给它,这样,该进程在整个运行期间,便不会再提出资源要求,从而破坏了“请求”条件。系统在分配究源时,只要有一种资源不能满足进程的要求,即使其它所需的各资源都空闲也不分配给该进程

    第一种协议虽然简单易行且安全,但是它导致资源被严重浪费,严重的降低了资源的利用率;进程会经常发生饥饿现象。 因此比较推荐第二种协议。

  • 第二种协议: 该协议是对第一种协议的改进,它允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。

3.3、破坏“循环等待”条件

答:

  • 具体做法: 首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源) 一次性申请完;
  • 原理: 一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象,进而预防死锁的发生。

缺点

  • 不方便增加新的设备,因为可能需要重新分配所有的编号;
  • 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;
  • 必须按规定次序申请资源,用户编程麻烦。

在这里,我们需要解释一下,为什么产生死锁的必要条件是4个,但是在预防死锁的时候,我们没有介绍怎么破坏互斥条件,理由如下:互斥条件是非共享设备所必备的,不仅不能改变,反而还应该加以保护

4、避免死锁(银行家算法)

答:在避免死锁的方法中,把系统的状态分为两种:安全状态(是指系统能按某种顺序如<P1,P2,…,Pn>(称<P1,P2,…Pn>序列为安全序列),来为每个进程分配其所需资源,直到最大需求,使每个进程都可顺序完成。)和不安全状态,当系统处于安全状态时,可以避免死锁的发生,反之,当系统处于不安全状态时,可能导致死锁的发生。

当有一个进程请求一个可用资源时,系统需要对该进程的请求进行计算,若将资源分配给进程后系统仍处于安全状态,才将资源分配给该进程。

5、死锁的检测与解除

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

(1)保存有关资源的请求和分配信息;

(2)提供一种算法,它利用这些信息来检测系统是否进入死锁状态

在这里插入图片描述

5.1、检测死锁的算法中

  • 在资源分配图中,找出既不阻塞又非独立的进程结点Pi,在顺利的情况下,Pi可以得到所需的资源而继续运行,直至完成,然后释放它所占有的所有资源。这相当于消去它所有的请求边和分配边,使之称为孤立的结点。
  • 进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。然后重复上面的过程,消去请求边和分配边。
  • 若能消去图中所有的边,使得图中的进程结点变为孤立点,则称该图是可完全简化的,否则称该图是不可完全简化的。

有文献证明: 所有的简化顺序都将得到相同的不可简化图。
死锁定理表明: 如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

5.2、解除死锁

  • 抢占资源: 从一个或者多个进程中抢占足够多数量的资源,分配给死锁进程,以解除死锁。
  • 终止进程法(包括终止所有死锁进程和逐个终止进程): 终止系统中的一个或多个死锁进程,纸质打破循环环路,使系统从死锁状态中解脱出来。
  • 进程回退法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

22款奔驰C260L升级小柏林音响 全新15个扬声器 提升音乐效果

奔驰新款C级号称奔驰轿车的小“S”&#xff0c;在配置方面上肯定也不能低的&#xff0c;提了一台低配的车型&#xff0c;通过后期升级加装件配置提升更高档次&#xff0c;打造独一无二的奔驰C级&#xff0c;此次来安排一套小柏林之声音响&#xff0c;效果怎么样&#xff0c;我们…

bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb

相关内容 bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds&#xff1a; ceph-deploy mds-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设…

独立站邮件营销大佬,手把手教你如何做好!

做独立站邮件营销的方式&#xff1f;独立站怎么做邮件营销&#xff1f; 邮件营销&#xff0c;作为独立站营销的重要手段之一&#xff0c;越来越受到卖家的重视。如何才能做好邮件营销呢&#xff1f;蜂邮EDM将手把手教你如何做好独立站邮件营销&#xff0c;让你在电商领域中更上…

银行转账p图手机软件,实现回执单截图生成,用Swing或JavaFX实现

其实总体用了很少的代码&#xff0c;就是模版图框架代码实现&#xff0c;模版也是网上的&#xff0c;非常多总体实现的原理还是绘图功能&#xff0c;捕捉用户输入。 用户界面 (UI): 我们可以使用Swing或JavaFX来创建一个窗口界面&#xff0c;允许用户输入所需的信息。 数据处理…

Sui上TVL突破1.28亿美金,浅谈DeFi续创新高背后的基础知识

根据财富商业洞察研究&#xff0c;DeFi市场预计从2022年的555.8亿美元增长到2030年的3370.4亿美元。推动这一增长的活动包括对token的交易、借贷和借款&#xff0c;这通常是点对点的&#xff0c;无需传统金融机构的参与。随着Sui网络于今年五月份启动主网和其SUI token&#xf…

MCU常见通信总线串讲(五)—— CAN总线协议

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…

生成式AI:压缩与加密的新方式

目前围绕生成式AI的大部分讨论都纯粹集中在结果上&#xff1a;你可以与它交谈&#xff0c;你可以生成艺术作品和视频&#xff0c;它可以生成声音。 这些都是非凡的成就。 然而&#xff0c;我相信&#xff0c;如果你以几种方式重新构建生成式AI&#xff0c;你会得到一些非常有趣…

Vatee万腾的数字化掌舵:Vatee科技引领未来的新高度

随着数字化时代的到来&#xff0c;Vatee万腾以其卓越的科技决策力成为引领潮流的掌舵者。 Vatee万腾通过对科技前沿的不懈探索&#xff0c;站在了数字化创新的最前沿。其领先的科技团队致力于发掘并应用最新的数字技术&#xff0c;为用户提供卓越的数字化体验。 Vatee万腾以其…

NR CA bandwidth class

CA配置对应的是Band combination&#xff0c;每个band对应支持的 CA bandwidth class&#xff0c;如下表Table 5.3A.5-1。 BW_channel,max对应的是协议中中规定的最大channel 带宽&#xff0c;FR1 R16对应的就是100MHZ。 如上述黄色字体部分&#xff0c;考虑的是实网下UE上报…

【React】Redux基本使用

什么情况使用 Redux &#xff1f; Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话&#xff0c;当我们有以下的应用场景时&#xff0c;我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…

自动化测试:PO模式设计框架详解

引言 你是否曾经因为每次更新功能都要重新写一堆自动化测试代码而感到疲惫不堪&#xff1f; 或者因为页面元素的频繁变动而不得不持续地修复测试脚本&#xff1f; 如果你也有这些苦恼&#xff0c;那么PO模式设计框架可能是解决之道。它可以让你以更简单、更高效的方式编写自…

SM5203 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器

SM5203 1.2A/18V 锂电池线性充电芯片 简介&#xff1a; SM5203 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器&#xff0c;并带有锂电池正负极反接保护功能&#xff0c;可以保护芯片和用户安全。由于采用了内部 PMOSFET 架构&#xff0c;加上防倒充电路&#xff…

前端开发人员应该知道的低代码系统知识和开源低代码开发平台

前端开发有多重要 前端一般指前端开发&#xff0c;主要是通过各种前端技术及工具进行产品界面开发&#xff0c;制定标准化代码&#xff0c;另外还要在页面增加交互的动态功能&#xff0c;通过技术改善用户体验&#xff0c;使得Web界面可以更友好的与用户互动。 前端开发是创建…

劲松HPV防治诊疗中心谭巍主任建议:这样锻炼可促使hpv转阴

锻炼可以帮助我们提升身体素质&#xff0c;也有利于身体健康&#xff0c;然而锻炼对于促进HPV转阴也有一定帮助&#xff0c;但并不是唯一的有效方法&#xff0c;即便如此锻炼仍然在hpv转阴方面发挥着一定作用。以下是一些建议&#xff0c;希望可以帮助你通过锻炼来促进HPV转阴&…

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 templates模板按app顺序寻找模板全局模板 静态文件jqueryBootstrap dja…

C语言--数组的长度计算【详细解释】

一.数组的长度计算公式 我们都知道字符串有特定的函数strlen,而数组没有&#xff0c;&#xff08;虽然字符串也是一种特殊的数组&#xff09; 但是&#xff0c;类似于这样的数组&#xff1a; int arr[]{12,89,1,5,31,78,45,12,12,0,45,142,21,12}&#xff1b; 我们很难一眼…

浏览器存储(localStorage和sessionStorage)

我们知道 js 写的效果&#xff0c;每次刷新都是从新执行&#xff0c;是不存在记录操作的&#xff0c;主要是大部分的效果不需要这样的处理 (一个 tab 切换&#xff0c;焦点图肯定不需要记住运行到哪里&#xff0c;刷新从新开始就好了)&#xff01; 在 html5 之前&#xff0c;前…

DDR SDRAM 学习笔记

一、基本知识 1.SDRAM SDRAM : 即同步动态随机存储器&#xff08;Synchronous Dynamic Random Access Memory&#xff09;, 同步是指其时钟频率与对应控制器&#xff08;CPU/FPGA&#xff09;的系统时钟频率相同&#xff0c;并且内部命令 的发送与数据传输都是以该时钟为基准…

gin索引 btree索引 gist索引比较

创建例子数据 postgres# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; SELECT 5000000postgres# vacuum ANALYZE t_hash; VACUUMpostgres# \timing Timing is on. postgres# select * from t_hash limit 10;id | …