第八章:死锁

8.1 死锁的基本概念

8.1.1 死锁的概念

  • 死锁
    • 所谓死锁,是指多道程序系统中,一组进程中的每个进程均无限期地等待该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称系统处于死锁状态,简称死锁。
    • 处于死锁状态的进程称为死锁进程
  • 活锁与饥饿
    • 假设有一对进程使用两种资源,每个进程需要两种资源,它们利用轮询原语enter_region去尝试取得必要的锁,如果尝试失败,则该进程继续尝试。如果进程A先运行并得到资源1,然后进程2运行且得到资源2,以后不管哪一个进程运行,都不会有任何进展,但是哪一个进程也没有被阻塞。结果两个进程总是一再消耗分配给它们的时间片,但是没有进展也没有阻塞。因此,没有出现死锁现象(因为没有进程阻塞),但是从现象上看,好像死锁发生了,这就是活锁。
    • 一个打印工作繁忙的系统中,有一个进程要打印一个很大的文件,而每当打印机空闲时,系统便把打印机分配给打印最小文件的进程。如果始终存在一个固定的进程流,其中的进程都是只打印小文件,那么要打印大文件的进程“永远”也得不到打印机,该进程会“饥饿而死”,尽管它没有被阻塞,但被无限推后
    • 进程出现饥饿现象是指进程的优先级较低而长时间得不到调度
    • 死锁现象:相关进程进入阻塞状态,且无法唤醒
    • 活锁现象:相关进程没有阻塞,可被调度,但是没有进展

8.1.2 死锁的产生原因

  • 产生死锁的原因 ❄❄❄❄
    • 竞争资源,系统提供的资源数量有限,不能满足每个进程的需求
    • 多道程序运行时,进程推进顺序不合理
  • 资源的概念
    • 永久性资源(可重用资源)
      • 是指系统中哪些可供进程重复使用、长期存在的资源
      • 如:内存、外部设备、CPU等硬件资源,以及各种数据文件、表格、共享程序代码等软件资源
    • 临时性资源(消耗性资源)
      • 是指由某个进程所产生、只为另一个进程使用一次或经过短暂时间后边不再使用的资源
      • 如I/O和时钟中断、同步信号、消息等
    • 永久性资源和临时性资源都可能导致死锁产生
  • 死锁的例子
    • 申请不同类资源产生死锁
      • P1拥有设备A,请求设备B;P2拥有设备B,请求设备A
    • 申请同类资源产生死锁
      • P1申请一页内存,P2申请一页内存,…,P1释放一页内存,P2释放一页内存…
    • P、V操作使用不当产生死锁(同步互斥使用不当)
      • P1和P2先进行互斥信号量P操作,再进行同步信号量P操作
    • 对临时性资源的使用不加限制而引起的死锁
      • P1等待接收P2发来的信件Q后向P2发送信件R,P2等待接收P1发来的信件R后向P1发送信件Q

8.1.3 产生死锁的必要条件

  • 永久性资源产生死锁的必要条件
    • 互斥条件
      • 资源是独占的且排他使用。进程互斥使用资源,即任一时刻一个资源只能给一个进程使用,其他进程若请求一个资源而该资源被另一个进程占有时,则申请者等待,直到资源被占用者释放。
      • 例子
        • 没有采用SPOOLing技术的系统中,进程P1和P2同时申请使用同一台打印机
    • 不可剥夺条件
      • 又称不可抢占或不可强占。进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能由获得该资源的进程自愿释放。
      • 例子
        • 进程P1额外申请内存不成功,则持有原有的内存进入阻塞状态
    • 请求和保持条件
      • 又称部分分配或占有申请。进程每次申请它所需要的一部分资源,在申请新的资源的同事,继续占用已分配到的资源
      • 例子
        • 进程P1拥有打印机并申请扫描仪
    • 循环等待条件
      • 又称环路等待。在发生死锁时,必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待的环路。环路中每一个进程已占有的资源同时被另一个进程所申请,即前一个进程有后一个进程所请求的资源
      • 例子
        • 进程P1等待P2完成视频解压缩的信号,P2正等待P1发来的解压数据

8.1.4 解决死锁的方法

  • 预防死锁
  • 避免死锁
  • 检测死锁
  • 解除死锁

8.2 死锁预防

  • 在设备分配中,预防死锁的策略包括 ❄❄❄❄❄
    • 可以向输出缓冲区写数据(SPOOLing系统)
    • 一次分配所有资源(静态分配资源)
    • 有序分配资源
    • 剥夺其他进程的资源
  • 在计算机系统中,形成死锁的必要条件是 ❄❄
    • 资源互斥使用
    • 部分分配资源
    • 已分配资源不可剥夺
    • 资源申请形成环路

8.2.1 破坏“互斥条件”

  • 如果资源不被一个进程所独占,那么死锁肯定不会产生
  • 以打印机为例,允许两个进程同时使用打印机会造成混乱,但是可以通过采用假脱机技术,允许若干进程同时产生输出。其设计思想就是创建管理真正打印机的打印机守护进程,由于守护进程决不会请求别的资源,从而可以消除因打印机而产生的死锁。
  • 为了预防死锁,可以在交叉路口建设立交桥。那么,该方法使得死锁的哪一个必要条件不成立(互斥条件)

8.2.2 破坏“不可剥夺”条件

  • 若一个进程申请某些资源,首先系统应检查这些资源是否可用,如果可用,就分配给该进程。否则,系统检查这些资源是否分配给另外某个等待进程。若是,则系统将剥夺所需资源,分配给这个进程。如果资源没有被等待进程占有,那么该进程必须等待。在其等待过程中,其资源也有可能被剥夺
  • 为了预防死锁,可以在路口设置了黄色网格缓冲区,车辆可以倒车退出路口,该方法使得死锁的哪一个必要条件不成立(不可剥夺条件)

8.2.3 破坏“请求和保持”条件

  • 使用静态分配资源策略
  • 仅当进程没有占用资源时才允许它去申请资源,如果进程已经占用了某些资源而又要再申请资源,则它应先归还所占的资源后再申请新资源
  • 对于系统中的独占设备,为预防出现死锁,应采用的最佳分配策略是:静态分配、分配时加锁
  • 解决死锁有多种方法,一次分配所有资源来解决死锁的方法称为死锁预防
  • 为了防止死锁,可以在路口使用交通红绿灯。那么,该方法使得死锁的哪一个必要条件不成立(请求和保持条件)

8.2.4 破坏“循环等待”条件

  • 采用资源有序分配策略,其基本思想是将系统中所有资源顺序编号,一般原则是,较为紧缺、稀少的资源的编号较大。进程申请资源时,必须严格按照资源编号的顺序进行,否则系统不予分配。即一个进程只有得到编号小的资源,才能申请编号大的资源;释放资源时,应按编号递减的次序进行
  • 哲学家进餐场景
    • 给其中某一个哲学家增配一只筷子
    • 仅当某哲学家左右两边的筷子都可用时,才允许他取筷子
    • 最多允许4个哲学家可以同时申请进餐
    • 奇数号的哲学家先取左边的筷子,偶数的则先取右边的筷子
  • ❄❄ 资源有序分配法属于一种死锁预防方法
  • 为了防止死锁,可以将路口某一方向(南北或东西方向)道路实行单向行驶。那么,该方法使得死锁的哪一个必要条件不成立(循环等待条件)

8.3 死锁避免

  • 死锁避免的基本思想:系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源;如果分配资后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略
  • 死锁避免和死锁预防的区别
    • 死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格地防止死锁的出现
    • 死锁避免则不那么严格地限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。
  • 死锁避免是在系统运行过程中注意避免死锁的最终发生

8.3.1 安全与不安全状态

  • 安全状态:如果系统能按某个顺序为每个进程分配资源(不超过其最大值)并能避免死锁,那么系统状态就是安全的。即如果存在一个安全序列,那么系统处于安全状态。
  • 死锁状态一定是不安全状态
  • 安全状态 -> 不安全状态 -> 死锁状态

8.3.2 银行家算法

  • 资源分配表
    • ❄❄❄❄❄❄ 根据最大资源需求量与已分配资源数量,算出各类资源的总量与进程需要的资源数量
  • ❄❄ 银行家算法是应对死锁的一种算法,其实现的是死锁避免算法

8.4 死锁检测与解除

8.4.1 死锁检测

  • 死锁检测:系统允许部分进程发生死锁,通过定时运行资源分析程序报告是否已有死锁的方法称为死锁检测

8.4.2 死锁解除

  • 死锁解除:系统允许发生部分死锁,一旦发现有死锁进程,则通过杀死死锁进程来解决死锁问题的方法称为死锁解除
  • 方法 ❄❄
    • 剥夺某些进程所占有的资源
    • 撤销某些进程
    • 重新启动系统
    • 进程回退法
  • ❄❄ 哪些措施能够恢复或解除死锁
    • 撤销已陷入死锁的进程
    • 强制剥夺其他进程的资源并分配给死锁进程

8.5 资源分配图

8.5.1 死锁的表示–资源分配图 ❄❄❄❄❄

第八章:死锁_第1张图片

  • P={P1,P2,P3}
  • R={r1,r2,r3,r4}
  • E={,,,,,
  • 资源实例个数为:| r1 | = 1,| r2 | = 2,| r3 | = 1,| r4 | = 3,
  • 进程状态如下:
    • 进程P1已占用一个r2类资源,且正在等待获得一个r1类资源
    • 进程P2已占用r2和r3类资源各一个,且正在等待获得一个r3类资源
    • 进程P3已占用一个r3类资源

第八章:死锁_第2张图片

8.5.2 死锁判定法则

  • 死锁定理的描述是:当且仅当当前状态的资源分配图不可完全化简的

8.5.3 资源分配图化简法

你可能感兴趣的:(操作系统原理)