210 likes | 363 Views
Ch7 死锁. 何为死锁 ? 死锁的必要条件 : 四条 死锁的预防 : 预先静态分配法 , 有序资源使用法 死锁的避免 : 银行家算法 死锁的检测 : 资源分配图 死锁的恢复 : 强制性撤消进程 , 挂起和解挂机构. 7.1 死锁问题的提出. 死锁 : 计算机系统中两个或多个进程无限期地等待永远 不会发生的条件 , 称此系统处于死锁状态 . 环境 : 某些资源互斥地使用 . 原因 :(1) 系统资源不足 ;(2) 进程推进的顺序不合适 . 乙进程 Y 共同进展路径 1 的进展 死锁点 占用 输入机 禁区
E N D
Ch7 死锁 • 何为死锁? • 死锁的必要条件:四条 • 死锁的预防:预先静态分配法,有序资源使用法 • 死锁的避免:银行家算法 • 死锁的检测:资源分配图 • 死锁的恢复:强制性撤消进程,挂起和解挂机构
7.1 死锁问题的提出 • 死锁:计算机系统中两个或多个进程无限期地等待永远 不会发生的条件,称此系统处于死锁状态. • 环境:某些资源互斥地使用. • 原因:(1)系统资源不足;(2)进程推进的顺序不合适. • 乙进程 Y 共同进展路径1 • 的进展 死锁点 • 占用 • 输入机 禁区 • 占用打印机危险区32占用输入机X 占用打印机 甲进程的进展
7.2 死锁的必要条件 • 资源的概念 • 分配方式: “可抢占”资源, “不可抢占”资源 • 使用方式: “共享”资源, “独占”资源 • 使用期限: 永久资源, 临时资源 • 资源的共同性质:一个进程由于请求一个资源而未被满足,从而该进程被阻塞. • 定义:一个逻辑资源(简称资源)是指可以引起一个进程进入等待状态的事物.
死锁的必要条件: 互斥条件:一个资源一次只能被一个进程所使用 不可抢占条件:一个资源仅能被占有它的进程所释放,而不能被 别的进程强行强占. 部分分配条件:一个进程已占有了分给它的资源,但仍然要求其 它资源. 循环等待条件:若干个进程构成环行请求链,其中每个进程均占 有若干种资源中的某一种,同时每个进程还要求 (链上)下一进程所占有的资源. R1 P1 P2 R2
防止死锁发生(破坏条件之一) 死锁的必要条件: 防止死锁发生 互斥条件 允许多个进程同时访问资源 不可抢占条件 强迫进程暂时释放资源给其它进程 部分分配条件 “预先静态分配法” 循环等待条件 “有序资源使用法”
7.3 死锁的预防 • 之一:预先静态分配法(破坏部分分配条件)策略: 作业调度时,仅当系统满足作业运行时所需的全 部资源时,才把该作业调入内存运行.在作业运行前 一次性将其所需的全部资源分配给它,于是在作业 运行过程中不再会提出新的资源请求. 缺点: 资源浪费! 改进: 程序 -> 程序步; 资源分配以程序步为单位! 优点: 资源利用率提高,减少资源浪费! 不足: - 增加了应用系统的设计和执行开销! - 作业所需资源不能一次性满足-->可能无限延迟! - 作业所需资源逐步积累 -->占而不用-> 资源浪费!
死锁的预防之二 • 有序资源使用法: (破坏循环等待条件) 策略:把系统中的全部资源分别分给一个特定的序号,并且要求每个进程均应严格地按照序号递增的次序请求资源. 优点: 基于动态分配方法,资源利用率较前法提高. 关键: 小心安排资源序号!问题: 1) 各类资源序号一经安排,不宜经常地随意改动; 2) 资源序号尽可能反映多数作业的实际使用资源的顺序,但总有不合适的作业而造成资源浪费.
7.4 死锁的避免和银行家算法 • 预防:破坏死锁必要条件之一,保证死锁不发生(限制条件较强,实现简单,但严重损害了系统性能) • 避免: 不严格限制必要条件(限制条件较弱,可能获得满意结果) • 安全状态:指系统按某种进程顺序(如P1,P2,…,Pn)来为每个进程分配其所需资源,直到最大需求,使每个进程都可以顺利完成,此时系统所处状态为安全状态。该进程顺序称为安全序列.-----至少具有一个安全序列的状态是安全状态! • 不安全状态:若系统没有这样一个安全序列,则系统处于不安全状态。即无论再按照什么方式分配都将最后导致死锁! • 每次分配资源之前先要判断此分配方式是否最终导致系统可能由安全状态进入不安全状态。按照安全序列分配资源!
银行家算法 • 问题:一个银行家在若干个顾客间共享他的资金(capital),每个顾客所需借款总额need<=capital. • 任务:银行家应能使他当前的全部顾客在有限时间内完成他们的交易(也就归还了他们的借款!) 顾客状态:(claim,loan),claim=need-loan 银行家状态:(capital,cash) ,cash=capital-loan • 银行家算法:保证银行家状态从一个安全状态转向另一个安全状态——不死锁!(判断状态是否安全) 从当前状态S(顾客状态+银行家状态)出发,逐个检查各顾客中谁的claim<=cash,若其得到资源后能完成工作且归还全部借款,再进而检查谁又能完成工作,…,如果所有顾客均能完成,则状态是安全的。
避免死锁的算法:银行家算法 假设有三个进程P、Q、R,系统只有某类资源共10个,而三个进程合计申请资源数为20个。 目前的分配情况如下:
而系统 8 + 2 = 10 此后P、R再申请资源就不能分配了。因为现在只剩下2个资源,不能满足它们的最大要求 (P:4, R:7),如果将剩下2个分配给P或R,则会产生死锁。
然而将2个资源分给Q (只需一个)则 系统资源回收为4个 Q可运行结束、释放 此后可将4个资源分组P… 即 Q P R
由此可见,按银行家算法来分配资源是不会产生死锁的。因为按该算法分配资源时,每次分配后总存在一个进程,如果让它独立单独运行下去,必然可获得它所需的全部资源,也就是说它能结束。而它结束后可以归还这类资源来满足其它申请者的需要。这也说明了存在一个合理的系统状态序列,可确保系统不会进入死锁状态的路径。由此可见,按银行家算法来分配资源是不会产生死锁的。因为按该算法分配资源时,每次分配后总存在一个进程,如果让它独立单独运行下去,必然可获得它所需的全部资源,也就是说它能结束。而它结束后可以归还这类资源来满足其它申请者的需要。这也说明了存在一个合理的系统状态序列,可确保系统不会进入死锁状态的路径。
r1 r2 r3 r4 r1 r2 r3 r4 A B C D E 资源已分配情况 最大需求 * 单一种类资源引出的银行家算法的基本思想也同样适用于多种类的资源情况:
还需(剩余需求)矩阵 总共资源数 r = (6, 3, 4, 2) 已分资源数s = (5, 3, 2, 2) 余下资源数 t = (1, 0, 2, 0)
(1) 寻找剩余矩阵的某一未标记的行x,使得它的每一个元素都不大于向量t的对应元素,如果找不到转(4)。 (2) 对于找到的行x,表示可以满足它,标记此进程,并将它占有的资源加到向量t。 (3) 重复上述步骤,转(1)。 (4) 如果所有进程都已标记,则状态是安全的,否则为不安全。
7.5 死锁检测与恢复 • 条件:允许死锁必要条件存在,也未采用避免死锁的算法(提高资源利用率)——故死锁可能发生,需检测! • 定义:实际地检查系统中是否存在死锁,并标出那些进程和资源被牵扯在死锁中。 • 应用:允许前三个死锁的必要条件存在的系统中,检查系统中是否存在循环等待条件。 • 方法:资源分配图 P1 R P2 R1 P1 P2 R2 资源进程 资源分配 资源请求
资源分配图化简 • 化简:一个进程的所有资源要求均能被满足,则该进程得到其所需全部资源从而不断取得进展,直至完成全部任务并释放出全部资源。 • 在有向图中找到既非阻塞又非孤立的结点,分配它所需的全部资源后,当它继续执行并完成然后释放其全部资源而使之成为孤立结点。 • 把孤立结点释放的资源分配给阻塞进程,使之能继续运行,并且在有限时间后完成,再释放其全部资源而成为新的鼓励结点。 • 经过一系列上述步骤,若能消去图中所有的边,使所有进程都成为孤立结点,则图可完全化简。否则为不可完全化简。 • 死锁定理:当且仅当系统某状态S所对应的资源分配图是不可化简的,则S是死锁状态。而不可被化简的进程即是被死锁的进程。反之,若状态S所对应的资源分配图是可化简的,则S是安全状态。 • 资源分配图的化简结果与化简顺序无关,最终结果是相同的!
P1 P1 P2 P2 P1 P1 P2 P2 P1 P2
P1 P1 P2 P3 P2 P3 不可化简 P1 P1 P2 P3 P2 P3
死锁恢复 • 强制性地从系统中撤消进程并剥夺它们的资源给剩下的进程使用。 • 撤消进程的原则: • 进程的优先数; • 重新启动它并运行到当前撤消点所需的代价; • 作业的外部代价:即与此进程相关的作业类型都可以有其相应的固定撤消代价。 • 挂起和解挂机构: • 从被挂起进程那里强占资源以解除死锁。