七、并发:饥饿与死锁

概要

  • 死锁的原理、预防、避免和检测
  • 管理资源的策略和方法
  • 死锁的综合策略
  • 哲学家就餐问题

提纲——死锁

  • 死锁原理
    • 死锁概念
    • 资源、资源分配图与死锁定理
    • 死锁的条件
  • 死锁预防
  • 死锁避免
    • 进程启动拒绝
    • 资源分配拒绝(银行家算法)
  • 死锁检测与恢复
  • 综合策略

5.1死锁

image

5.1.1死锁的概念

  • 死锁:一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引发的事件(释放占有资源/进行某项操作)
  • 死锁是多个进程因竞争资源且推进顺序不合理而造成的一种僵局,若无外力作用,这些进程将永远不能再向前推进

5.1.2联合进程图

  • 记录进程共享资源的历史和分析死锁的工具
  • 两个进程的联合进程图是一个二维网络,三个进程的联合进程图是一个三维网络
  • 四种区域
    • 安全区域(白色)
    • 敏感区域(黑色)
    • 死锁区域(黑色)
    • 不可达区域(彩色)
  • 可能死锁的进程举例
    image
  • 联合进程图——死锁举例
    image
  • 不会死锁的进程举例
    image
  • 联合进程图——无死锁的例子
    image

5.1.3可重用资源

  • 资源分类
    • 可重用资源:(如图书)与可消费资源(如食物)
    • 可剥夺资源:(如处理机、内存等)与不可剥夺资源(如打印机、表、队列、信号量等)
    • 永久性资源与临时资源
  • 可重用资源
    • 一次只能供一个进程安全地使用,且不会由于使用而耗尽的资源
    • 可以获得、使用和释放,能够再次被使用
    • 例子:处理器、I/O通道、主存和辅存、设备、文件、数据库、信号量等数据结构
  • 涉及可重用资源死锁的例子
    image

5.1.4消耗性资源

  • 消耗性资源
    • 可以创建(生产)并且可以消耗掉的资源
    • 数目没有限制,当一个进程得到一个可消耗性资源的时,这个资源就不存在了
    • 例子:中断、信号、消息、I/O缓冲区中的信息
  • 涉及消耗性资源死锁的例子
    image

5.1.5资源分配

  • 用有向图描述的进程死锁模型
    image
  • 表示法
    • 资源类(资源的不同类型):方框
    • 资源实例(存在于每个资源类中):黑圆点
    • 进程:圆圈中加进程名
    • 占有(分配边):资源实例指向进程的一条有向边
    • 请求(申请边):进程指向资源实例的一条有向边
  • 死锁定理
    • 如果资源分配图中没有环路,则系统中没有死锁,如果存在环路则系统中可能存在死锁
    • 如果每个资源类中只包含一种资源实例,则环路是死锁存在的充分必要条件
      image
  • 资源分配图例
    image

5.1.6死锁的三个必要条件

  • 互斥
    • 进程对所分配到的资源进行排他性使用:在一段时间内某资源只由一个进程占有
    • 若其他进程要求该资源,需求者需阻塞,直到占有该资源的进程用毕释放
  • 占有且等待
    • 进程已占有至少一项资源,并提出新的资源要求
    • 若该资源已被其他进程占有,则请求进程阻塞,同时对已获得的其他资源保持不放
  • 不抢占
    • 进程已获得的资源在未使用玩之前不能被抢占,只能在使用后自行释放
  • 环路等待条件
    • 资源分配图中存在环路,即进程集合合{P0, P1, P2, …, Pn}(n>=2)中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,......,Pn正在等待已被P0占用的资源
      image

5.2预防死锁现象发生

  • 四类方法
    • 鸵鸟算法:对死锁视而不见
    • 预防死锁:通过破坏产生死锁四个条件中的一个或多个条件,保证不会发生死锁
    • 避免死锁
    • 检测死锁

5.2.1破坏互斥条件

  • 方法:不直接操作资源或多个进程,而使用虚拟资源
  • 适用条件
    • 资源的固有特性运行多个进程同时使用(如文件运行多个进程同时读)
    • 借助特殊技术允许多个进程同时使用(如打印机借助Spooling技术)
  • 缺点
    • 不适用于绝大多数资源

5.2.2破坏占有且等待条件

  • 方法
    • 禁止已拥有资源的进程再申请其他资源
    • 要求所有进程在开始时一次性地申请在整个运行过程所需的全部资源
    • 申请资源时要先释放其占有资源后,再一次性申请所需全部资源
  • 优点
    • 简单、易于实现、安全
  • 缺点
    • 进程延迟运行
    • 资源严重浪费

5.2.3破坏不抢占条件

  • 方法
    • 占有资源的进程提出新的资源请求,而不能立即满足时,必须释放已占有的所有资源,以后重新申请
    • 操作系统抢占一个进程占有的资源,分配给其他进程
  • 适用条件
    • 资源的状态可以很容易地保存和恢复(如CPU)
  • 缺点
    • 代价大、实现复杂、反复申请/释放资源
    • 系统开销大、降低系统吞吐量

5.2.4破坏环路等待条件

  • 方法
    • 要求每个进程必须任何时刻只能占有一个资源,如果要申请第二个则必须先释放第一个(不现实)
    • 对所有资源按类型进行线性排队,进程申请资源必须严格按资源序号递增的顺序(可避免循环等待)
  • 缺点
    • 排序困难,类型序号的安排只能考虑一般作业的情况,限制了用户简单、自主地编程
    • 易造成资源的浪费(会不必要地拒绝对资源的访问)
    • 可能低效(会使进程的执行速度变慢)
  • 资源按序分配方法说明
    • 例子:某多进程应用程序,有四个数据文件db1、db2、db3、db4,每个进程都要打开其中的每个文件,完成事务处理
      • 每个进程,打开文件的顺序严格按资源序号递增的顺序db1->db2->db3->db4,即必须先打开db1才能打开后面的文件,如此类推
      • 如果进程1要用到db1、db2和db4,则必须先打开db1,再打开db2,最后才打开db4,而非随意打开

5.3死锁避免

  • 不需事先采取限制措施破坏产生死锁的必要条件,而是在资源的动态分配过程中,采用某种策略防止系统进入不安全状态,从而避免发生死锁
  • 两种死锁避免的方法
    • 不启动其资源请求会导致死锁的进程
    • 不允许会导致死锁的进程的资源请求

5.3.1进程启动拒绝模型

  • n个进程和m种资源
    • 系统资源总量向量R=(R1,R2, … , Rm),Rj为第j种资源的总数
    • 系统当前可用(aVailable)资源总量向量V=(V1,V2, … , Vm), Vj为第j种资源的剩余数
    • 进程-资源需求(Claim)矩阵C,Cij=进程i对资源j的请求数
    • 进程-资源分配(Allocation)矩阵A,Aij=当前已经分配给进程i的资源j数
  • 系统正常状态下,模型有如下性质:
    image
  • 进程启动拒绝策略(新进程image
    image

5.3.2资源分配拒绝

  • 模型
    • 系统状态:由资源总量向量R=(R1,R2, … , Rm )、系统可用资源总量向量V=(V1,V2, … , Vm )、进程-资源需求矩阵C和进程-资源分配矩阵A表示
    • 安全状态:至少存在一个执行时序,使当前所有进程都能运行到结束状态
    • 不安全状态:不存在一个执行时序,使当前所有进程都能运行到结束状态
  • 安全状态举例
    image
    image
    image
    image
    image
  • 不安全状态举例
    image
    image
  • 资源分配拒绝策略
    • 只要系统处于安全状态,必定不会进入死锁状态
    • 不安全状态不一定是死锁状态,但不能保证不会进入死锁状态
    • 死锁避免的实质:如何避免系统进入不安全状态
      • 如果一个新进程的资源请求会导致不安全状态,则拒绝启动这个进程
      • 如果满足一个进程新提出的一项资源请求后,会导致不安全状态,则拒绝分配资源给这个进程

5.3.3银行家算法

  • 全局数据结构
    image
  • 资源分配算法
    image
  • 死锁避免分析
    • 优势:比死锁预防限制少
    • 无需死锁检测中的资源剥夺和进程重启
  • 不足
    • 事先声明每个进程请求的最大资源
    • 考虑的进程必须是无关的,即它们执行的顺序没有任何同步要求的限制
    • 分配的资源数目必须是固定的
    • 在占有资源时进程不能退出
  • 银行家算法——安全状态判定
    image

5.4死锁检测

  • 没有任何预先限制措施(死锁预防)
  • 资源分配时不检查系统是否进入不安全状态(死锁避免)
  • 系统可能出现死锁
  • 系统检测是否出现死锁
  • 死锁发生时进行恢复

5.4.1死锁检测时机与算法

  • 检测时机
    • 资源申请时(早起检测,算法相对简单,但处理机时间消耗大)
    • 周期性检测,或死锁“好像”已经发生(如CPU使用率降低到一定阈值时
  • 检测方法
    • 单个资源实例:检测资源分配图中是否存在环路(依据——死锁定理)
    • 多个资源实例:类似银行家算法的安全检查

5.4.2恢复方法

  • 抢占法:连续抢占资源直到不再发生死锁
  • 回退法:每个死锁进程回滚到某些检查点,并且重新启动所有进程(死锁可能重现)
  • 杀死进程法:
    • 杀死所有死锁进程(最常用)
    • 或连续杀死死锁进程直到不再发生死锁
    • 或杀死一个非死锁进程
      image

5.5一种综合的死锁策略

  • 把资源分为不同资源类
    • 可交换空间:进程交换所用外存中的存储块
    • 进程资源:可分配的设备,如磁带设备和文件
    • 内存:可按页或段分配
    • 内部资源:I/O通道
  • 为预防在资源类之间由于循环等待产生死锁,可使用线性排序策略
  • 在一个资源类中,使用该类资源最适合的算法

5.6哲学家就餐问题

  • 5个哲学家,每天思考、吃意大利面
  • 必须用两把叉子吃面,但每人只有一把叉子
  • 饥饿:某些哲学家长期无法用餐

5.6.1使用信号量的解决方案

  • 方案A
    image
  • 方案B
    image

5.6.2使用管程的解决方案

image

posted @ 2024-11-18 20:25  韦飞  阅读(155)  评论(0)    收藏  举报