死锁

死锁-死锁预防、死锁避免(资源分配与银行家算法)、死锁检测、死锁解除 文章目录1 死锁2 死锁预防3 死锁避免4 死锁检测5 死锁解除6 参考文献 1 死锁 什么是死锁     通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。比如哲学家进餐问题。 死锁产生的四个必要条件     互斥:至少有一个资源必须属于非共享模式,即资源一次只能被一个进程使用;     占有并等待:进程自己有一部分资源,又想得到别人占有的资源;     非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放     循环等待:若干进程之间形成一种头尾相接的环形等待资源关系 ;      阅读详情

讨论死锁产生的原因以及应对策略。

概述

计算机系统中有很多独占资源,依次只能被一个进程使用(打印机等)。

所有的操作系统都具有授权一个进程排他访问某一资源的能力,这个能力包括软件和硬件。

很多进程需要独占的访问几个资源,而这时候,多个进程可能无限制地等待其他进程将独占资源释放,也就是等待永远不会发生的条件,这种情况叫做死锁。

资源

进程对设备、文件等获得独占性的访问权时有可能会发生死锁,为了尽可能地通用化,将这种需排它使用的对象称为资源

资源有两类:

  • 可剥夺式资源可从拥有它的进程处剥夺而没有任何副作用,存储器是一类可剥夺资源。(例如内存)

  • 不可剥夺资源无法在不导致相关计算失败的情况下将其从属主进程处剥夺。(打印机)

死锁原理

死锁发生的必要条件

互斥:任一时刻只允许一个进程使用资源
请求和保持:进程在请求其余资源时,不主动释放已经占用的资源
非剥夺:进程已经占用的资源,不会被强制剥夺
环路等待:环路中的每一条边是进程在请求另一进程已经占有的资源。

死锁模型

可以使用图模型来表示,其中矩形表示资源(里面的圆点表示实例),圆圈表示进程

没有产生死锁的情况:

52686896239

产生死锁:

52686900078

可以总结出:

  • 如果一个图模型没有环,则不可能有死锁
  • 如果一个图存在环
    • 若每一个资源只有一个实例,那么会发生死锁
    • 若每个资源有多个实例,那么可能会发生死锁

死锁策略

鸵鸟算法

这是最简单的算法。虽然死锁出现以后很棘手,但实践表明,死锁很少发生。

因此,我们可以假装没有这个事情,如果发生了,仅仅需要重启一下就好。

虽然看起来很蠢,但这种方法被包括UNIX等大多数操作系统所使用。

死锁的检测和恢复

  • 采用这种技术,系统只需监听资源的请求和释放。每次资源被请求或释放时,资源图被更新,同时检测是否存在环路,若存在,则撤销环中的一个进程,直到不产生环路。
  • 另外一种更粗略的方法是周期性的检测是否有进程连续阻塞超过一定时间,若发现,则撤销该进程。

死锁的预防

按照之前提出的四个必要条件,我们只需要破除其中的一个,则死锁绝对不会发生。

破坏互斥

类似于假脱机技术,使用一个守护进程来真正请求资源。

并且,需要把守护进程设计成完整的输出文件就绪后才开始打印。

禁止已拥有资源的进程等待其他资源

  1. 规定所有进程在开始执行前请求所需要的所有资源
    • 不显示,因为许多进程直到运行才知道它需要多少资源。
    • 这种方案不能最优化资源的使用。
  2. 当一个进程请求资源时,先暂时释放当前的所有资源,然后再尝试一次来获得所需的所有资源。

破坏不可抢占

这是不太现实和棘手的。

消除环路

  1. 简单的保证每一个进程在任何时候只占用一个资源
    • 这种限制是不可接受的
  2. 给所有资源提供一个全局编号
    • 进程申请资源必须按照编号顺序
    • 或者仅要求不允许进程请求编号比当前所有占用资源编号低的资源

避免死锁

不必对进程强加一些规则来避免死锁,而是通过对每一次资源请求认真的分析来判断是否能安全的分配。

银行家算法

基本思想
  • 一个小城镇的银行家向一群客户分别承诺了一定的贷款额度,考虑到所有客户不会同时申请最大额度贷款,他只保留较少单位的资金来为客户服务

  • 将客户比作进程,贷款比作设备,银行家比作操作系统

算法
  • 对每一个请求进行检查,检查如果满足它是否会导致不安全状态。若是,则不满足该请求;否则便满足。

  • 检查状态是否安全的方法是看他是否有足够的资源满足某一客户。

  • 如果可以,则这笔投资认为是能够收回的,然后检查最接近最大限额的客户,如此反复下去。如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。

52687030889

其中,a、b是安全的,c是不安全的。

资源轨迹图

52687036857

两阶段加锁法

  • 死锁预防的方案过于严格,死锁避免的算法又需要无法得到的信息
  • 实际情况采取相应的算法
    • 例如在许多数据库系统中,常常需要将若干记录上锁然后进行更新。当有多个进程同时运行时,有可能发生死锁。常用的一种解法是两阶段加锁法
    • 第一阶段,进程试图将其所需的全部记录加锁,一次锁一个记录。
    • 若成功,则开始第二阶段,完成更新数据并释放锁。
    • 若有些记录已被上锁,则它将已上锁的记录解锁并重新开始第一阶段

总结以上策略的优缺点如下:

52687007973

参考资料

  1. Operating System:Design and Implementation,Third Edition
什么是死锁?如何产生死锁死锁的必要条件?怎么解决死锁 什么是死锁?如何产生死锁死锁是一个非常让程序猿烦恼的问题,一旦所写的程序有了死锁,那么程序就无法执行下去,会出现严重的 bug,并且死锁非常隐蔽,我们不会轻易发现它,在开发阶段,不经意期间我们就会写出死锁,很难检测出来。那么什么是死锁呢?竟然让我们如此烦恼。“死锁”就是2个或2个以上的线程互相持有对方想要的资源,导致各自处于阻塞等待状态,致使程序无法执行下去,这就是“死锁”。简单来说:一共有两个线程两把锁,T1线程拿到了A锁,T2拿到了B锁,但是T1还想要B锁,T2还像要A锁,谁也不释放锁,就会产生死锁 阅读详情

相关推荐

从原理到实践:MIPI D-PHY v1.2的HS-Deskew功能全解析(附时序详解)

本文深入解析MIPI D-PHY v1.2的HS-Deskew功能,从技术背景到实现机制,详细介绍了其在2.5Gbps高速传输中的关键作用。通过时序详解和实测数据,帮助工程师理解并应用这一技术,解决信号完整性问题,提升系统可靠性。

weixin_30300225的博客 270

SQLSERVER数据库快速查找死锁信息

题外话:之所以写这个博客,是应了群里大家的要求,从来没有写过,写的不好多担待。 引言:不要以为看到引言就觉得像是写书,其实我是想在这里说下我寻找死锁的旅程。我们公司做的是web项目,大概一年前开始接手目前负责的部分就断断续续的出现死锁,出现的几率不多,就像大姨妈,基本每个月都会来一次,偶尔还会两次。开始时,只是知道程序报死锁错误,但是根本无从下手,以前没有接触过死锁啊,完全蒙圈啊。所以就把问题归结

风中使者的博客 6788

华为云CodeHub代码托管

什么是代码托管 代码托管(CodeHub)是面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。 代码托管具有以下特性 · 在线代码阅读、修改、提交,随时随地开发,不受地域限制。 · 在线分支管理,包含分支新建、切换、合并,实现多分支并行开发,效率高。 master分支:最为稳定,功能比较完整,随时可发布的代码。 develop分支:用于平时开

LUJINYUANA的博客 1万+

实践讲解死锁死锁检测(+文+代码)

(1)死锁:多个线程间相互申请锁住对方尚未释放的资源,如对象,方法等,线程间依赖等待对方释放资源,造成的死循环。 (2)Thread以标记弃用:Thread.suspend、Thread.resume和Thread.stop,因会造成死锁; (3)Thread停止推荐使用Thread.interrupt。

天然玩家的博客 1739

操作系统资源分配化简法---死锁的检测方法

操作系统——资源分配化简法---死锁的检测方法 一 、了解进程资源 二、 化简资源分配 方法步骤 第一步:先看系统还剩下多少资源没分配,再看有哪些进程是不阻塞(“不阻塞”即:系统有足够的空闲资源分配给它)的第二步:把不阻塞的进程的所有边都去掉,形成一个孤立的点,再把系统分配给这个进程的资源回收回来第三步:看剩下的进程有哪些是不阻塞的,然后又把它们逐个变成孤立的点。第四步:最后,所有的资源和进程都变

一拳Marx 1万+

操作系统死锁概念和资源分配

学《操作系统》这门课必须会学到死锁,那么死锁是什么概念呢?死锁是指:由于竞争资源或者通信关系,两个或更多线程在执行中出现,永远相互等待只能由其他进程引发的事件。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。下面我们来看一个有趣的例子:单向同行桥梁这个桥梁只能单向同行,要么往左,要么往右,不同方向的车会共享这个单向通行的桥梁。桥梁的每一部分可视为一个资源,如果整一个桥...

Cookie1997的小屋 1万+

死锁

转载于:https://www.cnblogs.com/wang931018/p/11198022.html

weixin_30372371的博客 413

什么是死锁死锁如何解决?

1、死锁是什么? 死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。 当多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进,这种情况就是死锁。 很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。 2、死锁产生的四个必要条件 (1)互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。 (2)不剥夺条件:进程所获得的

qq_44290077的博客 2万+

什么是死锁?如何避免死锁

一、定义   线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。 当然死锁的产生是必须要满...

momorobber的博客 3万+

MySQL死锁了怎么办(死锁的产生及解决方案),死锁的案例,死锁的排查,死锁的解决,如何避免死锁的发生

死锁是指2+的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

weixin_44797327的博客 1万+

预防死锁,检测死锁,避免死锁,解除死锁....

什么是死锁 在并发环境下,各个进程因竞争资源而造成的一种互相等待对方手里的资源,导致各个进程都阻塞,都无法向前推进的现象就是死锁。发生死锁后如果没有外力干涉就会导致任务无法向前推进。 进程死锁、饥饿、死循环的区别 死锁:各个进程互相等待对方手里的资源,导致个进程都阻塞,无法向前推进的现象。 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如在短进程优先算法中,如果有源源不断的短进程进入...

编程小白养成手记 1万+

Oracle数据库表的死锁的产生、查询死锁的表信息、死锁的解决

目录 一、死锁产生的原因 二、死锁产生的案例 三、查询死锁的信息 四、死锁的解决方法 1.用户知道死锁的语句的解决办法 2.用户不知道在哪死锁的解决办法 正文 一、死锁产生的原因 其实所有的死锁最深层的原因就是一个:资源竞争。造成这种原因基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。 二、死锁产生的案例   1:用户1对A表进行Upd...

zxljsbk的博客 2万+

死锁的处理策略—预防死锁、避免死锁、检测和解除死锁

(一)破坏互斥条件互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如: SPOOLing技术。操作系统可以采用 SPOOLing 技术把独占设备在逻辑上改造成共享设备。比如,用SPOOLing技术将打印机改造为共享设备…该策略的缺点:并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件。(二)破坏不剥夺条件不剥夺条件:进程所获得的资源在未使用完之前,不能由其他

一口Linux的专栏 7835

sql server死锁_了解SQL Server死锁形表示

sql server死锁 #contentor img { float: left; } #contentor img { float: left; } 介绍 (Introduction) If you are reading this I am sure you already know what a deadlock is, but just in...

culuo4781的博客 1590

DeadLock(死锁)问题的可视化分析方法

预防死锁的规则,给定所有互斥操作一个全序(至于什么是全序可以去查看集合论教材),用人话说就是所有的锁按照一个类似于自然数那样的严格顺序去获取。这样的获取方式就是安全的。扩展到三个执行流的情况,执行流超过三个涉及到高维空间就很难想象了,就以三个执行流1把锁为例说明问题,它的禁止区域是一个长方体。程序按照执行流的多寡可以按照如下进行划分:给与多个独立的硬件执行流,有些并发程序可以变成并行程序,但并不是所有的并发程序都可以变成并行程序。

tugouxp的专栏 1853

SQLSERVER数据库死锁分析

引言:有死锁,一定是并发造成,同一事物不会出现死锁,为什么要分析死锁?因为这是找死锁根源的第一步。看懂了才能做后面的事情。在百度上看到的死锁,基本都是由于sql语句得写法导致了锁表。下面我就要说下死锁中重要的信息。 死锁 这个是死锁,看起来好像很复杂,其实很简单,我们不需要全部看懂,为了后面分析死锁产生的原因,只需看懂我们需要的部分就可以了。 1.整体观察 a.左边椭圆是执行

风中使者的博客 3619

毕设&课程作业_基于物联网MQTT协议的智能停车场管理系统.zip

计算机类毕业设计、课程作业,系统源码!!!

上一篇: I/O软件原理
下一篇: 内存管理的基本思想与算法
zealscott
博客等级 码龄9年 327粉丝 196原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值