第5章 死锁与饥饿.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 死锁与饥饿 死锁与饥饿 死锁: 进程无限期的等待. 可察觉 饥饿: 进程无限期的得不到执行. 难以发现 死锁和饥饿都是由于进程竞争资源而引起的 . 5.1 死锁的概念 死锁定义 定义: 一组进程中的每一个进程,均等待此组进程中某个其他进程占有的,因而永远无法得到的资源,这种现象称为进程死锁。 定义死锁时刻: 等待发生时; 等待发生前(已注定死锁)。 由定义得到的结论 几个有用的结论: 参与死锁的进程至少有二个; 每个参与死锁的进程均等待资源; 参与死锁的进程中至少有两个进程占有资源; 死锁进程是系统中当前进程集合的一个子集。 5.2 死锁类型 死锁类型(Cont.) 5.3 死锁的条件 Coffman条件(必要条件) 资源独占(mutual exclusion) 不可抢占(non preemption) 保持申请(hold-while-applying) 循环等待(circular wait) 仅当上述条件都满足时,死锁才会发生(充要条件)。 破坏上述任意一个条件可以消除死锁。 5.4 死锁的处理 死锁预防(deadlock prevention)-静态 死锁避免(deadlock avoidance)--动态 死锁检测(deadlock detection) 死锁恢复(deadlock recovery) 5.5 资源分配图 5.5 资源分配图 例子(无环路,无死锁) 例子(有环路,有死锁) 例子(有环路,无死锁) 5.6 死锁预防 对进程有关资源的活动加限制,所有进程遵循这种限制,即可保证没有死锁发生。 优点:简单,系统不需要做什么。 缺点:对进程的约束,违反约束仍可能死锁。 预防方法: 预先分配法; 有序分配法。 5.6.1 预先分配法 进程:运行前申请所需全部资源; 系统: 能够满足,全部分配, 否则,一个也不分配。 破坏“hold-and-wait”条件 缺点: 资源利用效率低; 一次提出申请困难。 5.6.2 有序分配法 有序分配法 例子 例子 例子 5.7 死锁避免 银行家算法(Cont.) 银行家算法(Cont.) 银行家算法(Cont.) 资源分配 安全性检测算法 银行家算法例子 银行家算法例子 银行家算法的保守性 银行家算法的保守性 讨论 5.8 死锁的发现 5.8.1 死锁检测算法 Remarks 死锁例子 5.8.2 死锁检测时刻 5.9 死锁的恢复 5.10 鸵鸟算法 视而不见 Pro: 工程师观点(考虑死锁发生的频率,危害,处理代价) 死锁发生频率其它故障引起的系统瘫痪的频率 死锁处理constant overhead 危害 Cont: 数学家观点 必须处理,无论代价如何 目前系统实际如此 Eg. UNIX proc结构(50 and up) 5.11 有关问题的讨论 关于充要性算法 已知进程资源活动序列 复杂度高(NP Complete) 生灭资源问题 消息 消耗性资源与可重用资源并存 5.12 饥饿与活锁 饥饿:没有时间上界的等待 排队等待 忙式等待 饿死:等待时间超过极限(deadline) 饿死 vs 死锁 死锁进程处于等待状态,饿死不然 死锁可以检测,饿死不然 5.13 死锁的例子 过河问题 过河问题 过河问题 过河问题 思考问题 对于过河问题,考虑一个没有饿死情况的解法。 例2. 过河问题(2) 5.14 简单组合资源死锁的静态分析 死锁分析例子 死锁分析例子 死锁分析例子 5.15 同种组合资源死锁的必要条件 例子 数据结构: Available: array[1..m]of integer; Allocation: array[1..n,1..m]of integer; Request: array[1..n,1..m]of integer; 临时变量: Work: array[1..m]of integer; Finish: array[1..n]of boolean; Work:=Available; Finish:=false; 有满足条件的i: Finish[i]=false Request[i]?Work Finish[i]=true; Work:=Work+Allocation[i] T ?i ,finish[i]=true T F F 无死锁 死锁 Finish[I]=true for allocation[I]=0 1. 上述算法可以检测到参与死锁的全部进程,包括占有资 源和不占有资源的进程。 2. 如果希望只检测占有资源的进程,初始化时: Finish[i]=true, for Allocation[I]=0 例子:R={A(7),B(2),C(6)};

文档评论(0)

yyh892289 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档