死锁 操作系统笔记整理系列

Posted 雨宙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁 操作系统笔记整理系列相关的知识,希望对你有一定的参考价值。

死锁

系统模型

  1. 资源类型有很多,如CPU周期、文件、I/O设备等。
  2. 每一个系统拥有有限数量的资源,需要分配到若干竞争进程,这些资源可以分为多种类型,每种类型具有一定数量的实例。
  3. 在正常操作模式下,进程只能按如下顺序使用资源:
    (1)申请:进程请求资源,如果申请不能立即被允许,例如申请的资源正在被其他进程使用,那么申请进程应等待,直到它能获得该资源为止。
    (2)使用:进程对资源进行操作。
    (3)释放:进程释放资源。

死锁问题

  1. 一组阻塞的进程,每个进程持有一个资源,并等待获得资源集中的另一个进程持有的资源。

另一种定义:一组进程每一个进程都在等待一个事件,等待事件只能由同组进程的另一个进程引起。

死锁特征

死锁的必要条件

  1. 如果在一个系统中以下四个条件同时成立,那么就能引起死锁:
    (1)互斥(mutual exclusion):对于资源访问,如果一个资源被一个进程访问,那么,这个资源不能被其他进程访问。
    (2)持有等待(hold and wait):一个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。(另一种说法:一个进程在申请资源时,可能已经拥有其他资源,拥有的其他资源可能被其他进程申请)
    (3)非抢占(no preemption):资源不能被抢占,即资源只能在进程完成任务之后被进程自愿释放。
    (4)循环等待(circular wait):有一组等待进程P0,P1,…,Pn,P0等待的资源被P1占有,P1等待的资源被P2占有,…,Pn等待的资源被P0占有。

资源分配图

  1. 进程节点和资源节点、申请边和分配边
  2. 一个资源节点有多个实例,进程节点申请资源,资源节点中的一个实例被分配给进程节点。
  3. 如果分配图没有环,那么系统就没有进程死锁;如果分配图有环,那么可能存在死锁。
  4. 如果每个资源类型刚好有一个实例,那么有环就意味着已经出现死锁。
  5. 如果每个资源类型有多个实例,那么有环并不意味着已经出现了死锁。

处理死锁的方法

一般来说,处理死锁问题有三种方法:
(1)不允许死锁发生。(死锁预防、死锁避免)
(2)允许系统进入死锁状态,然后恢复。(死锁检测、死锁恢复)
(3)忽略这个问题,假装系统从未发生死锁。被大多数操作系统使用,包括UNIX。

死锁预防(静态策略)

发生死锁有4个必要条件,只要确保至少一个必要条件不成立,就能预防死锁发生。

  1. 互斥:若能使所有资源可非互斥共享,则可以打破互斥条件。然而,通常不能通过否定互斥条件来预防死锁,因为有的资源本身就是非共享的。例如,一个互斥锁不能同时被多个进程所共享。
  2. 持有等待:必须保证当一个进程请求资源时,它本身不持有任何资源。
    (1)要求进程在开始执行之前请求并被分配到所有的资源。
    (2)只有当进程本身不持有任何资源时才允许进程请求资源。
    (3)缺点:资源利用率低,发生饥饿(一直申请不到资源)。
  3. 非抢占:
    (1)如果一个持有某些资源的进程请求另一个不能立即分配给它的资源,那么当前持有的所有资源都会被释放。例:进程A拥有资源R1,申请资源R2,R2没有办法分配给A,此时资源R1可以被抢占。
    (2)抢占资源被添加到进程正在等待的资源列表中。
    (3)只有当进程能够重新获得旧资源以及它正在请求的新资源时,进程才会重新启动。
  4. 循环等待:
    资源排序,只能按升序规则申请资源。例:P1可以申请R2,P2可以申请R3,P3不可以申请R1。

死锁避免(动态策略)

安全序列与安全状态

  1. 安全序列就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成,只要存在一个安全序列,系统就是安全状态。(安全序列可能有多个)
  2. 安全序列里的每个进程所请求的资源,能被当前空闲的资源和其他进程所持有的资源所满足,这里的其他进程先执行,然后将资源分配给此进程。
  3. 如果系统处于安全状态,一定不会发生死锁;如果系统进入不安全状态,就可能发生死锁。
  4. 可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态。

死锁避免算法

资源分配图算法(每一个资源有一个实例)
  1. 需求边(虚线)->申请边->分配边
  2. 只有当将申请边转换为分配边不会导致资源分配图中形成一个环时(此时的环包括需求边),申请才能被授予。
银行家算法(每一个资源有多个实例)
  1. 核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态,如果会进入不安全状态,就暂时不答应此次请求,让该进程先阻塞等待。
  2. 安全性算法(找序列):每次都找出还没有完成的进程,且这个进程所需要的资源小于等于当前空闲资源,将所需的资源分配给这个进程,进程结束后,空闲资源为分配给这个进程的资源和原先剩下的空闲资源,直到所有的进程结束。
  3. 资源分配算法:请求的资源可以小于进程所需的资源,请求资源在满足分配条件时,被分配给请求进程,此时进程所需资源为原所需资源减去分配给进程的资源。

死锁检测

如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统很可能发生死锁。

  1. 保持等待图(每个资源只有一个实例):周期性检测等待图看有无环,n^2时间复杂度。
  2. 类银行家算法(每个资源有多个实例):m*(n^2)时间复杂度,m表示资源种类数

死锁恢复

并不是系统中的所有进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程。

  1. 进程终止
    (1)终止所有死锁进程。
    (2)每次中止一个进程,直到回退到足以避免死锁的地步。
  2. 资源抢占(需要解决选择牺牲进程、回滚和饥饿的问题)

以上是关于死锁 操作系统笔记整理系列的主要内容,如果未能解决你的问题,请参考以下文章

王道操作系统笔记——— 死锁的处理策略

多线程系列八:线程安全

11.8-全栈Java笔记:死锁及解决方案

操作系统学习笔记---死锁

操作系统概念笔记——第七章:死锁

操作系统学习笔记 死锁