操作系统 死锁问题

资源分类

  1. 可抢占资源
    指某进程在获得这类资源后,该资源可以再被其他进程或系统抢占。对于这类资源是不会引起死锁的。 CPU和主存均属于可抢占性资源。
  2. 不可抢占资源
    一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
    磁带机、刻录机、打印机、共享变量等也都属于不可抢占性资源。
  3. 可消耗资源
    又称为临时性资源,它是在进程运行期间,由进程动态的创建和消耗的,如进程间通信的消息、信号量等。
  4. 不可抢占资源和可消耗资源会导致死锁问题

死锁产生的原因

  • 死锁的起因,通常是源于多个进程对不可抢占资源和可消耗资源的争夺,而根本原因就在于系统资源不足
  • 通常原因有:

1、进程推进顺序不当产生死锁

场景一(争夺不可抢占资源):设系统有打印机、读卡机各一台,它们被进程P和Q共享。两个进程并发执行,它们按下列次序请求和释放资源:
进程P 进程Q
请求读卡机 请求打印机
请求打印机 请求读卡机
释放读卡机 释放读卡机
释放打印机 释放打印机
死锁场景:若进程P、Q几乎同时分别请求读卡机、打印机,并获得成功,然后再分别请求打印机与读卡机时,因已无用可用资源而双双陷入等待状态。

场景二(争夺消耗性资源) :进程Q1和Q2共享两个可再用资源R1和R2。s1和s2分别代表资源R1和R2能否被使用的信号量,由于R1和R2是共享的,必须使用互斥。因而s1和s2的初值为1。假定两个进程都要求使用两个资源,它们的程序如下:
在这里插入图片描述
死锁场景:若进程Q1 、 Q2几乎同时分别执行P(s1)、P(s2)请求资源R1、R2,并获得成功,然后再分别P(s2)、P(s1)请求资源R2、R1,因两个资源已经分别分配出去,进程Q1 、 Q2双双陷入等待状态

2、所有进程在等待并不存在的消耗性资源

  • 在进程通讯时使用的信件可以看作是一种临时性资源,如果系统中初始条件没有信件,但都一开始都要求接收信件,则可能引起死锁

在这里插入图片描述

死锁和资源数量的关系

  • 一般情况下,某系统同类资源m个,供n个进程共享。如果每个进程至少申请k个资源,m、n、k满足什么条件,系统就不会发生死锁?
    解:每个人进程先分配k-1个资源,就会先分配掉(k-1)*n个资源,最后再分配一个资源给其中一个进程,这样进程结束释放资源就不会导致死锁。所以有表达式:(k-1)*n+1<=m,只要满足这样的条件,系统就不会发生死锁。

死锁的定义

  1. 死锁的定义
    一组进程中的每一个进程,均无限期地等待此组进程中某个其他进程占有的,因而永远无法得到的资源,这种现象称为进程死锁。

  2. 产生死锁的必要条件

    • 互斥条件( mutual exclusion ):一个资源在同一时刻只能分配给一个进程。任何时刻一个资源仅为一个进程独占,若另一进程请求一个已被占用的资源时,必须等到占用者释放资源。

    • 请求和保持条件(hold-while-applying) :进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有。

    • 不可抢占条件(non preemption):进程已获得的资源,在未使用完之前不能被抢占,只能在进程使用完时由自己释放。

    • 循环等待条件(circular wait):叫环路等待条件,存在一个循环等待链,其中,每一个进程分别等待它前一个进程所持有的资源,造成永远等待

  3. 处理死锁的方法

    • 预防死锁(deadlock prevention):该方法是通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。这种方法是最容易实现的

    • 避免死锁(deadlock avoidance) :不事先采取各种限制措施,去破坏产生死锁必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,避免发生死锁。

    • 检测死锁(deadlock detection) :事先不采取任何限制性措施,允许进程在运行过程中发生死锁。但通过检测机构,及时地检测出死锁的发生,并解除死锁。

    • 解除死锁(deadlock recovery) :当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来。常用的方法是撤消一些进程,回收它们的资源,分配给已处于阻塞状态的进程,使其能继续运行。这种方法并发程度最高,资源利用率最高

预防死锁

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

  1. 第一种协议
    一次性申请完在整个运行过程中需要的所有的资源
  2. 第二种协议
    先申请初期需要的资源,在运行的时候再逐步释放已经用完的资源,并且申请需要的资源

二、破坏“不可抢占”的条件

  • 要求已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。从而破坏了“不可抢占”条件。

三、破坏“循环等待”的条件

  • 有序的资源分配法:在这种方法中规定,系统将所有的资源按其类型进行线性排队,并赋予不同的序号。所有进程对资源的请求必须严格按资源序号递增的次序提出,如果出现已经获得高次序的资源但是想要申请低序号的资源的时候,就要先释放掉所有高次序资源和同等级资源,才能重新申请资源。这样,在所形成的资源分配图中,不可能再出现环路,因而摒弃了“循环等待”条件

避免死锁——银行家算法

一、安全状态

  • 安全状态:如果系统中存在一种执行路径,使可用的系统资源能满足所有进程的资源请求得到满足,从而顺利结束,称系统处于安全状态,这个执行路径中,各进程依次顺利结束的顺序<p1,p2,…,pn>称为安全序列。

  • 处于安全状态的系统一定是不会发生死锁的

二、银行家算法

当一个进程提出资源请求时,银行家算法要做的工作其要点是:
①判断有无实施资源分配的可能。如果系统有能力,则实施预分配。
②预分配。
③判断分配后系统是否安全,若安全,则真正实施分配。
在这里插入图片描述
在这里插入图片描述

举例说明:

假定系统有五个进程p0-p4,和三类资源A\B\C,各类资源的数量分别是10、5、7,在t0时刻的时候资源分配的情况如下:
在这里插入图片描述
(1)t0时刻的安全性:利用安全性算法对t0时刻的资源分配进行分析,看是否安全
解:由题,存在一个安全序列{p1,p3,p4,p2,p0},所以系统是安全的(看图)
在这里插入图片描述
(2)p1请求资源{1,0,2}
假设给p1分配资源,用银行家算法进行检查:

  • p1请求资源{1,0,2}<需要的资源{1,2,2}——因为不能超过总量max
  • p1请求资源{1,0,2}<可用资源{3,3,2}——如果多于这个量就不应该分配资源,而是p1进入等待。
  • 假定系统给p1分配资源,使用银行家算法实现:
    这个时候的资源分配图如下:
    在这里插入图片描述
    这个时候的安全性检查如下:
    在这里插入图片描述
    所以这个系统是安全的,可以立即给p1分配资源

死锁检测

  1. 资源分配图
    该图是由一组结点N,和一组边E所组成的一个对偶G=(N,E),它具有下述形式的定义和限制:
  2. 死锁定理
    我们可以利用把资源分配图加以简化的方法(删去与死锁无关的进程、资源及资源分配请求关系),来检测当系统处于S状态时,是否为死锁状态。(s状态:所有耳朵节点都是孤立的)
  3. 简化方法
  • 在资源分配图中,找出一个既不阻塞又非独立的进程结点Pi。在顺利的情况下,Pi可获得所需资源而继续运行,直至运行完毕,再释放其所占有的全部资源,这相当于消去pi的请求边和分配边,使之成为孤立的结点。在图(a)中,将p1的两个分配边和一个请求边消去,便形成图(b)所示的情况。
  • p1释放资源后,便可使p2获得资源而继续运行,直至p2完成后又释放出它所占有的全部资源,形成图(c)所示的情况。
  • 在进行一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的。
    S为死锁状态的充分条件是: 当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。
    在这里插入图片描述
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值