死锁和产生死锁的四个必要条件以及如何避免和预防死锁

article/2025/9/21 19:08:27

什么是死锁

如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程就是死锁的。

死锁出现的场景

(1)多个线程:彼此申请对方资源而导致的死锁。A申请B的资源时,因为资源被占用,A会被挂起等待B释放资源,同时B申请A的资源,因资源被占用B挂起等待A释放资源,而AB都处于挂起状态又无法释放资源,便形成了死锁。

(2)单个线程:A有自己的资源,但还要申请新的资源,而新的资源被占用,则A会挂起等待,同时会保护的资源而不释放,形成死锁。

死锁产生的原因

1. 系统资源的竞争:系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。

2. 进程运行推进顺序不合适:进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。

产生死锁的四个必要条件:

互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求时,该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件: 若干进程间形成首尾相接循环等待资源的关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

避免死锁的方法:

1)死锁避免的基本思想:

系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。

2)如何避免死锁? 

在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。 一般来说互斥条件是无法破坏的,所以在预防死锁时主要从其他三个方面入手 :

(1)破坏请求和保持条件:在系统中不允许进程在已获得某种资源的情况下,申请其他资源,即要想出一个办法,阻止进程在持有资源的同时申请其它资源。

方法一:在所有进程开始运行之前,必须一次性的申请其在整个运行过程中所需的全部资源,这样,该进程在整个运行期间便不会再提出资源请求,从而破坏了“请求”条件。系统在分配资源时,只要有一种资源不能满足进程的需要,即使其它所需的各资源都空闲也不分配给该进程,而让该进程等待,由于该进程在等待期间未占用任何资源,于是破坏了“保持”条件。

方法二:要求每个进程提出新的资源申请前,释放它所占有的资源。这样,一个进程在需要资源S时,需要先把它先前占有的资源R释放掉,然后才能提出对S的申请,即使它很快又要用到资源R。

两种协议比较:第二种协议优于第一种协议,因为第一种协议会造成资源的严重浪费,使资源利用率大大的降低,也会由于占据大量资源导致其它进程的饥饿问题。

(2)破坏不可抢占条件:允许对资源实行抢夺。

方式一:如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源,如果有必要,可再次请求这些资源和另外的资源。

方式二:如果一个进程请求当前被另一个进程占有的资源,则操作系统可以抢占另一个进程,要求它释放资源,只有在任意两个进程的优先级都不相同的条件下,该方法才能预防死锁。

(3)破坏循环等待条件

对系统所有资源进行线性排序并赋予不同的序号,这样我们便可以规定进程在申请资源时必须按照序号递增的顺序进行资源的申请,当以后要申请时需检查要申请的资源的编号大于当前编号时,才能进行申请。

3)死锁避免和死锁预防的区别:

死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。

利用银行家算法避免死锁:

        所谓银行家算法,是指在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。

按照银行家算法的思想,当进程请求资源时,系统将按如下原则分配系统资源:

(1) 当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程。

(2) 进程可以分期请求资源,当请求的总数不能超过最大需求量。

(3) 当系统现有的资源不能满足进程尚需资源数时,对进程的请求可以推迟分配,但总能使进程在有限的时间里得到资源。

(4) 当系统现有的资源能满足进程尚需资源数时,必须测试系统现存的资源能否满足该进程尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配。

死锁的解除

一旦检测出死锁,就应立即采取相应的措施,以解除死锁。死锁的解除主要有两种方法:

(1)抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。

(2)终止或者撤销进程。终止或者撤销系统中的一个或多个死锁进程,直到打破循环环路,使系统从死锁状态解脱出来。

好啦,今天就介绍这么多啦~~~


http://chatgpt.dhexx.cn/article/Cf3ugYEH.shtml

相关文章

理解死锁产生的四个必要条件

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

死锁,死锁的四个必要条件以及处理策略

一、什么是死锁二、死锁与饥饿三、资源的类型 3.1 可重用资源和消耗性资源 3.1.1 可重用资源(永久性资源)3.1.2 消耗性资源(临时性资源) 3.2 可抢占资源和不可抢占资源 3.2.1 可抢占资源3.2.2 不可抢占资源 四、死锁产生的原因 4…

死锁产生的四个必要条件(缺一不可)

死锁产生必须同时满足四个条件,只要其中任意一条不成立,死锁就不会发生。 1、互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某项资源只被 一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。如图一 2、非抢占:进程所获得的额资源在未使…

死锁的四个必要条件

死锁在高并发中是一个常见的名词。产生的四个必要条件如下: 互斥条件:一个资源同一时间能且只能被一个线程访问; 不可掠夺:当资源被一个线程占用时,其他线程不可抢夺该资源; 请求与等待:当资源被…

div在html垂直居中,div 垂直居中(css div水平垂直居中六种方法)

div垂直居中 div垂直居中代码示例如下: 前台效果如下图所示: 如图所示,div中的文字垂直居中。其中主要的属性就是line-height。 line-height属性设置行间的间隔(行高即垂直方向)。 line-height属性会影响行框的规划。在应用到一个块级元素时&…

使用css3将一个div水平和垂直居中显示

使用css3将一个div水平和垂直居中显示 方案一: div绝对定位水平垂直居中【margin:auto实现绝对定位元素的居中】, 代码两个关键点:1.上下左右均0位置定位; 2.margin: auto; 其width、height如何更改都是居中显示的,兼容…

CSS 实现DIV水平垂直居中(二)

CSS 实现DIV垂直居中 上期介绍了CSS实现div水平居中的五种方法,下面介绍CSS实现div垂直居中的几种方法。上篇:CSS 实现DIV水平居中 首先还是和上期同样的两个div盒子,以下方法实现div垂直居中,效果如图: 1.通过padding上下留白实…

div中的内容水平垂直居中

1. div高度自适应的情况 div在不设置高度的时候,会被里面的内容撑开,内容自动填充在div中,无论是一行内容还是多行内容,此时不需要设置垂直居中,内容自动在中间的, 想要看的更直观些,只需要加上…

Div水平垂直居中

(1)父元素设置弹性盒子display:flex; 再加上justify-content:center;align-items:center; 推荐 (2)使用top:50% left:50% 以及margin-top 和 margin-left 来进行定位 注意: 必须知道盒子的具体的宽和高,否…

html 中div垂直居中的三种方式

1、第一种&#xff1a; <style type"text/css"> <!-- .con_div{ width:400px; height:300px; border:1px solid #777; text-align:center; display:table-cell; vertical-align:middle; background:red; color:#fff; lin…

如何让一个div水平垂直居中

在工作中 经常会碰到让一个div框针对某个模块水平垂直居中 针对这种情况 有多种方法 现在一一实现一下 一. div绝对定位水平垂直居中 margin 负间距 代码: .box {width: 200px;height: 200px;background: yellow;position: absolute;left: 50%;top: 50%;margin-left: -100px;m…

CSS实现DIV垂直水平居中

CSS实现DIV垂直水平居中 在页面设计中&#xff0c;很多地方都需要div的垂直水平居中&#xff0c;在前端开篇的学习中&#xff0c;也是使用较多的地方&#xff0c;所以我整理了三种方法帮助大家去解决问题&#xff0c;代码可直接使用&#xff0c;仅供参考学习。 方法 方法一&a…

div文字垂直居中的方法有哪些?

首先我们应该知道文字的水平居中比较简单,行级元素设置其父元素的text-aligncenter,块级元素设置其本身的left和rightmargins为auto即可。但是div文字的垂直居中就不是那么简单了,所以我们就来具体看看div文字垂直居中的几种实现方法。 1、vertical-align属性让文字居中 ver…

关于让div元素垂直居中的几种方法

如何用让嵌套在里面的div居中 本人是一个前端新手&#xff0c;如何让两个相互嵌套的div&#xff0c;让里面的div居中是一个比较简单的问题&#xff0c;面试也常问&#xff0c;我就从其他博客中提取稍微总结一下&#xff08;转载侵删&#xff09;&#xff0c;也加了一点自己的困…

css 文本和div垂直居中方法汇总

在样式布局中&#xff0c;我们经常碰到需要将元素居中。通过css实现元素的水平居中较为简单&#xff1a;对文本&#xff0c;只需要对其父级元素设置text-align: center;&#xff0c;而对div等块级元素&#xff0c;只需要设置其left和right的margin值为auto。要实现元素的垂直居…

CSS——div垂直居中及div内文字垂直居中

最近做demo时&#xff0c;经常需要div垂直居中或者让div内文字相对div垂直居中。水平居中比较简单&#xff0c;就不多说了&#xff0c;这里主要记录一下垂直居中的一些方法。 一、div垂直居中的一些方法&#xff1a; 1.当height、width固定大小时&#xff0c; <!DOCTYPE htm…

div水平垂直居中的常用方法

html5的文档结构 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title></title></head> <body></body> </html> 效果图&#xff1a; 1.通过设置绝对定位和设置负边距实现&…

div水平垂直居中的七种方法

学习笔记&#xff08;一&#xff09; div水平垂直居中的七种方法 文章目录 学习笔记&#xff08;一&#xff09;前言一、绝对定位法1.方法一2.方法二3.方法三4.方法四 二、flex布局法1.方法五 三、将小div转成行内块1.方法六 四、网格布局1.方法七 总结 前言 在写小demo过程中…

div 垂直居中的六种方法

利用CSS进行元素的水平居中&#xff0c;比较简单&#xff0c;行级元素设置其父元素的text-align center&#xff0c;块级元素设置其本身的left 和 right margins为auto即可。本文收集了六种利用css进行元素的垂直居中的方法&#xff0c;每一种适用于不同的情况&#xff0c;在实…

CSS进阶篇--div中的内容垂直居中的五种方法

一、行高&#xff08;line-height&#xff09;法 如果要垂直居中的只有一行或几个文字&#xff0c;那它的制作最为简单&#xff0c;只要让文字的行高和容器的高度相同即可&#xff0c;比如&#xff1a; p { height:30px; line-height:30px; width:100px; overflow:hidden; }这段…