死锁及死锁的处理策略

1 死锁

  死锁是指两个或两个以上的进程因竞争资源而造成的一种互相等待的现象,若无外力作用,这些进程都将无法向前推进。

2 死锁、饥饿和死循环的区别

  饥饿:由于长期得不到想要的资源而导致进程无法向前推进的现象。如在进程调度算法中的短进程优先算法中,若有源源不断的短进程到来,则长进程一直得不到处理机,从而发生了长进程饥饿。
  死循环:某进程执行的过程中一直跳不出某种循环的现象。死循环可能是因为程序bug或者程序员有意为之。

/ 区别
死锁 死锁进程一定处于阻塞态。死锁需要两个或两个以上的进程同时发生死锁的现象。
饥饿 饥饿进程可能是就绪态(长期得不到处理机)或阻塞态(长期得不到需要的I/O设备)。饥饿可能只有一个进程发生。
死循环 死循环进程是运行态,只是不能像预期那样顺利推进。死循环可能只有一个进程发生。

3 死锁产生的必要条件

  (1) 互斥条件。只有对必须互斥使用的资源争抢(如打印机设备)才能导致死锁。
  (2) 不剥夺条件。进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。如果进程可以抢夺其他进程持有自己需要的资源的话,也就不会产生死锁了,需要资源直接抢就行了。
  (3) 请求和保持条件。进程已经保持了至少一个资源,但是又提出了新的资源需求,而该资源又被其他进程占有,此时请求进程被阻塞,但是又对自己持有的资源保持不放。也是很简单的道理,如果一个进程请求的资源被阻塞,就释放了自己持有的资源,其他进程就可以获取它释放的资源,也就不会发生相互等待而导致死锁了。
  (4) 循环等待条件。存在一种进程资源的循环等待链,链中的每一个进程已经获得的资源同时被下一个进程所请求。


4 死锁发生的时机

  (1) 对系统资源的争抢。各进程对不可剥夺资源的竞争可能会引起死锁。
  (2) 进程推进顺序非法。如果请求资源的顺序不当也会导致死锁,如上面的图,双方请求的资源被对方占有而导致死锁。
  (3) 信号量的使用不当。并发执行进程时,如果信号量使用的顺序不当也会到导致死锁。
  总之,对不可剥夺的资源的不合理分配,可能导致死锁。

5 死锁处理策略

  (1) 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
  (2) 避免死锁。用某种方法防止系统进入安全状态,从而避免死锁(银行家算法)。
  (3) 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后才去某种措施解除死锁。

6 死锁处理策略——预防死锁

   6.1 破坏互斥条件

  如果把只能互斥使用的资源改造成允许共享使用,则系统不会进入死锁状态。如SPOOLing技术。操作系统可以采用SPOOLing技术吧独占设备在逻辑上改造成共享设备。它由专门负责 I/O 的常驻内存进程以及输入、输出井组成。比如,用SPOOLing技术将打印机改造为共享设备...

  缺点:并不是所有的资源都可以改造成共享使用的资源。并且为了系统安全,有时候还需要保护这种互斥性。

   6.2 破坏不可剥夺性

  方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时重新申请。
  方案二:申请的资源被其他进程占用时,借助操作系统的协助,剥夺进程资源,至于剥夺哪个进程资源可以根据优先级考虑。
  缺点:实现复杂。暂时请求不到某个资源,之前获取的资源就需要释放,以后重新申请,如果一直这样可能会导致饥饿。

   6.3 破坏请求和保持条件

  可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足之前,不让它运行。一旦运行,这些资源在运行期间一直归它所有,该进程就不会再请求别的任何资源。
  缺点:如果有些资源只需要用很短的时间,因此如果进程运行时间长,在运行期间都会保持持有所有资源,就会造成资源浪费,资源利用率低。此外,该策略可能导致某些进程饥饿。如下,如果C类进程需要资源1和资源2,如果有大量的A或B类进程,就会导致C类进程一直不能一次获取全部需要的资源,导致饥饿。

   6.4 破坏循环等待条件

  可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源一次申请完。
  原理:一个进程只要已占有小编号的资源时,才有资格申请更大号编号的资源。按照这样的规则,已持有大编号的资源就不会逆向回来申请小编号的资源,从而就不会产生循环等待的现象。
  缺点:
  (1) 实现复杂。
  (2) 不方便增加新的设备,因为要重新分配所有编号。
  (3) 进程实际使用资源的顺序可能和资源编号递增顺序不一致,会导致资源浪费。例如打印机设备编号2,输出设备编号为1,那么一个进程请求打印机设备前,必须先请求输出设备,而输出设备在请求打印机设备这一段时间内根本没有发挥作用,其他进程也不能访问,造成资源浪费。

7 死锁处理策略——避免死锁(银行家算法)

  7.1 引入

  假如你是一个成功的银行家,手里有100个小目标资金....现在有三家公司A、B、C分别向从你贷款

A 表示:大哥,我最多会跟你借70亿....
B 表示:大哥,我最多会跟你借40亿....
C 表示:大哥,我最多会跟你借50亿....

  然而,有个规则,如果借给企业的钱达不到企业提出的最大需求,那么钱可能就一去不复返了.....
  刚开始,三家公司分别从你这里借了20、10、30亿.......


  此时,手里还要40亿,此时B表示还要借20亿,那么你需要考虑可以借吗?
  如果给B借了20亿.....此时手里还要有20亿。


  之后看手里剩下的钱能不能周转过来,现在可以将剩下的20亿借给C,C就达到了最大需求,之后C还钱50亿,然后借给A,A达到最大需求,最后A还70亿,最后A........还好借给B20亿后,可以通过C->A->B这个顺序周转,所以这20亿可以借。
  现在看另一种情况,回到最初状态,现在手里还有40亿


  如果此时A想借钱30亿,那么同样需要考虑能不能借....先假设你借给了A这30亿

  现在手上还剩10亿,发现三个企业需要借钱的最少都要20亿(考虑最坏情况,三家企业借钱都要到最大需求),发现任何一家都不能满足,这不完了吗,血本无归,所以这30亿一定不能借。

   7.2 安全序列

  对于上面的第一种借给B20亿是安全的,因为会存在C->A->B这样的周转路径(安全序列),不会血本无归。
  安全序列:如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全的。一个系统的安全序列可能有多个
  如果分配了资源之后,系统中找不到任何一个安全序列,系统进入了不安全状态,这就意味着之后可能所有的进程都无法顺序执行下去。当然,如果有进程提前归还了一些资源(如对上面的第二中情况,如果B提前还10亿,那么就可以周转了....),那系统也可能重新回到安全状态,不过在分配资源之前总是考虑最坏情况 。
  如果系统处于安全状态,就一定不会发生死锁。如果系统进入了不安全状态未必一定发生死锁,但是发生了死锁一定是在不安全状态。

   7.3 银行家算法

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

(1) 检查此次申请是否超过了之前声明的最大需求数。
(2) 检查此时系统剩余的可用资源是否还能满足这次请求。
(3) 试探分配,更改各数据结构。
(4) 用安全性算法检查此次分配是否会导致系统进入不安全状态。
  安全性算法检查步骤:
检查当前剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程的所有资源回收。不断重复这个过程,看最终是否能让所有进程都加入安全序列。

7 死锁处理策略——检测和解除

  如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供两个算法:
  (1) 死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁。
  (2) 死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来。

  7.1 死锁的检测

  系统死锁可利用资源分配图来描述。


注:(1) P1、P2表示进程;R1、R2表示资源,R1类资源数为3,R2类资源数为2.
(2) 绿色箭头表示分配给进程的资源数,蓝色箭头表示进程向资源节点请求的资源数。

  上图可以看到,R1类资源的资源数已经全部分配完了,R2类资源还有一个资源。P1进程向R2类资源请求一个资源,P2进程向R1类资源请求一个资源。
  如果系统中剩余可用的资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利的执行下去。如果这个进程执行结束了把资源归还给系统,就可能使某些正在等待的资源的进程重新被激活,并顺利的执行下去。相应的,这些被激活的进程执行完后又会归还一些资源,这样可能又会激活另外一些阻塞的进程...

  按照上面的过程分析,最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于找到一个安全序列)。如果最终不能消除所有边,那么此时就是发生死锁了。
  最终还连着边的进程就是处于死锁状态的进程。
  检测死锁的算法:

(1) 在资源分配图中,找到既不阻塞又不是孤点的进程Pi(即找出一条有向边与它相连,且该有向边对应点额资源申请树龄小于等于系统中已有空闲资源数量。如下图中,R1没有空闲资源,R2有一个空闲资源,P1进程请求一个R2资源,满足继续运行的条件,而P2请求一个R1资源,此时R1没有资源,所以P2此刻不满足运行条件)。消去所有的请求边和资源分配边,使之成为孤立的节点。下图中P1进程是满足继续运行的节点,故将P1消去。
(2) 进程Pi所释放的资源,可以唤醒某些因等待这些资源的进程,原来阻塞的进程可能变成非阻塞进程。由于P1释放了R1资源,所以P2又满足了运行的条件,可以将P2的边都消去,最终消去了所有边,所以原图是可完全简化的。


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

  即使P3释放了资源,P1和P2进程都不满足继续运行的条件,所以此时P1和P2就是死锁进程。


  7.2 死锁的解除

  解除死锁的方法有:
  (1) 资源剥夺法。挂起(暂时放在外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他进程,但是应防止被挂起长时间导致饥饿。
  (2) 撤销进程法。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这中方法实现简单,但是也是有代价的,如果有些已经运行了很长时间了,离成功只有一步之遥了,此时撤销导致功亏一篑,还需要从头再来....
  (3) 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

  那么对哪些进程动手呢?可以考虑优先对以下的进程处理:
  (1) 优先级低的进程。
  (2) 执行时间段的进程。
  (3) 距离运行结束剩余时间长的进程。
  (4) 使用资源多的进程。
  (5) 批处理式而不是交互式的进程。

8小结 死锁处理策略

本文完

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容

  • 一.死锁的概念以及产生死锁的原因 1.死锁的定义 在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率...
    Chasel_H阅读 1,029评论 0 4
  • 1、竞态条件: 定义:竞态条件指的是一种特殊的情况,在这种情况下各个执行单元以一种没有逻辑的顺序执行动作,从而导致...
    Hughman阅读 1,226评论 0 7
  • 死锁的概念 死锁的定义 在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然...
    CodeKing2017阅读 1,297评论 0 4
  • 前两天我的同事把东西落在洗手间被单位的后勤人员捡到,但是因为她拿的是我的门禁卡,所以后勤人员通过门禁卡的信息打...
    绿萝文竹阅读 130评论 0 0
  • 当父亲逝世后 我看到您变了 变得寡言少语了 变得愁容满面了 一道道的皱纹 悄无声息的爬上您的额头 在父亲的墓前 我...
    执酒共酌阅读 203评论 0 2