第七章:死锁
第七章:死锁
在多道程序系统中,由于多个进程并发执行,大大改善了系统资源的利用率并提高了系统处理能力,但也带来了新的问题--死锁。
死锁
在多道程序环境中,多个进程可以竞争有限数量的资源。当一个进程申请资源的时候,如果此时无可用资源,则该进程进入waiting state。有时如果所申请的资源被其他进程占有,则该进程有可能再也无法改变其状态,这种情况叫做死锁。多个进程由于竞争有限资源导致僵局(互相等待),若无外力作用,则这些进程都无法向前推进。
ps: 此处注意理解 “互相等待” 的具体含义。同时注意:一般 os 不提供死锁预防措施。
7.1 系统模型
系统资源:有限种类,有限实例。
正常模式下,进程按照, 申请(request),使用(use) ,释放(release)来使用资源。
7.2 死锁特征
死锁的识别和检测是有一定难度的,因为它只在某些调度情况下出现。
四个死锁的必要不充分条件
-
互斥(mutual exclusion):
-
占有并等待(hold and wait):
-
非抢占(no preemption):
-
循环等待(circular wait):
资源分配图:(Resource Allocation Graph)--- to describe the deadlock
黑点表示资源实例,注意下分配边和申请边。
要求:通过观察图判断是否有deadlock,下面列举三个例子
结论:(a),(c) 无死锁,(b)有死锁
我们可以总结发现: 如果分配图中无环则系统无死锁,若有环则可能存在死锁。如果每种资源的实例只有一个,则存在环 等价于 出现死锁(环上的进程出现死锁)。如果每种资源有多个实例,则有环不一定会出现死锁,此时为必要不充分条件。
7.3死锁处理方法
-----设备利用率低,系统吞吐率低
-
Deadlock Prevention // Deadlock Avoidance 确保系统不进入死锁状态。
-
允许系统进入死锁状态,然后 Deadlock Detection Recovery from Deadlock
-
直接忽略问题,认为死锁不会发生。
7.4 Deadlock Prevention
确保死锁的四个必要条件至少有一个不成立即可预防死锁。
-
互斥(mutual exclusion):通常不能通过否定互斥条件预防死锁。因为有些资源本省就是非共享的,例如一个互斥锁。
-
持有并等待(hold and wait):保证每个进程在申请资源的时候不能占有其他资源。(all or none)缺点:资源利用率低且可能会出现starvation
-
无抢占(no preemption):如果一个进程持有资源并申请另一个不能立即分配的资源,那么这个进程的资源都可被抢占(隐形释放)。
可能会导致 live lock
-
循环等待(circular wait):对所有资源全排序,要求进程按递增顺序申请资源。
7.5 Deadlock Avoidance
一个最简单的模型:算法检查资源分配状态(进程可分配资源,已分配资源,最大需求),确保循环等待条件不会成立。
安全状态(safe state):如果系统能按一定顺序为每个进程分配资源(不超过它的最大需求),仍然避免死锁,那么系统的状态就是安全的(safe)。更为正式地说,只有存在一个安全序列(safe sequence),系统才处于安全状态。进程序列〈P1,P2,…,Pn.〉在当前分配状态下为安全序列是指:对于每个Pi,,Pi,仍然可以申请的资源数小于当前可用资源加上所有进程Pj(其中j
资源分配图算法:适用于单例资源
资源分配的变形可用于避免死锁。除了申请边和分配边外引入需求边(claim edge)。
现在假设进程Pi申请资源Rj。只有在将申请边Pi→Rj变成分配边Rj→Pi并且不会导致资源分配图形成环时,才能允许申请。通过采用环检测算法,检查安全性如果没有环存在,那么资源的分配会使得系统处于安全状态。如果有环存在,那么分配会导致系统处于非安全状态。在这种情况下,进程Pi应等待资源申请。
银行家算法(必考)