目录
5.1 死锁的概念
1.死锁定义:一组并发进程中的每个进程均等待此组进程中其他进程所占有的、因而永远无法得到的资源,这种现象称为进程死锁,简称死锁
2.定义死锁时刻
无限等待发生时
等待发生前(已注定会死锁)
3.有用的结论
参与死琐的进程至少有二个=>两个就能死锁
每个参与死锁的进程均在等待资源=>均处于等待状态
参与死锁的进程中至少有两个进程占有资源=>必须有资源参与
死锁进程是系统中当前进程集合的一个子集=>死锁进程的集合是动态的,随时间变化
5.2 死锁类型
5.2.1竞争资源引起的死锁
同种资源或者不同种资源
5.2.2进程间通信引起的死锁
P1:receive(P2,M1);
P2: receive(P3,M2);
P3: receive(P1,M3);
5.2.3其他原因引起的死锁
after you / after you
5.3 死锁的条件
1.Coffman条件(必要条件)
资源独占(mutual exclusion)
不可剥夺(non preemption)
保持申请(hold-while-applying)
循环等待(circular wait)
2.破坏上述任意一个条件即可消除死锁
5.4 死锁的处理(动静两种)
1.死锁预防(deadlock prevention)--静态:把可能性降低
2.死锁避免(deadlock avoidance)--动态:把可能性避免
3.死锁检测(deadlock detection)
4.死锁恢复(deadlock recovery)
5.5 资源分配图
5.5.1资源分配图的定义
1.定义资源分配图G=(V,E),V是结集点,E是边集。其中V=P∪R,P={p1,p2,…,pn},R={r1,r2,…,rm},E={(pi,rj)}∪{(rj,pi)},若pi∈P,rj∈R,那么申请边(pi,rj)表示进程pi申请资源rj,由进程pi指向资源类rj,而分配边(rj,pi)表示资源类rj的某个实例分配给进程pi,由资源实例指向进程pi
2.申请资源时,若pi申请rj中的一个资源实例,由pi向rj画一条申请边,如可满足申请,则改为分配边
3.释放资源时,去掉对应的分配边
(资源分配图有无环路不是判断死锁的唯一条件,无环路无死锁,有环路死锁可有可无)
5.5.2 资源分配图的约简
1.在资源分配图中寻找一个非孤立且没有请求边的结点pi,若无此结点则算法结束
2.去除pi的所有分配边,使其成为一个孤立结点
3.寻找所有申请边都可满足的进程pj,将pj的所有申请边全部改为分配边
4.转步骤1
5.6 死锁预防
1.预防只能降低发生的可能性,不能消除发生
2.对并发进程有关资源的活动加以限制,所有并发进程都遵循这种限制,即可保证没有死锁发生
优点:简单,系统不需要做什么
缺点:对进程的约束,违反约束仍可能死锁
3.预防方法
预先分配法
有序分配法
5.6.1 预先分配法
1.进程:运行前申请所需全部资源
2.系统:能够满足则全部分配给进程,否则一个也不分配
3.破坏“hold-while-applying”保持申请条件
4.缺点: 资源利用效率低 进程一次提出全部资源申请很困难
5.6.2 有序分配法
1.优点
与预先分配相比,资源利用率提高
2.缺点
资源编号困难
为保持按序申请,某些暂时不用的资源也需提前申请,牺牲了资源利用率
5.7 死锁避免
1.系统处于安全状态=>存在安全进程序列<p1,p2,…,pn>
2.进程序列<p1,p2,…,pn>安全=>p1,p2,…,pn可依次执行完
3.死锁只是系统不安全状态中的一种
4.死锁的避免是保证系统不进入死锁状态的动态策略。
5.8 死锁的检测
5.8.1 死锁检测算法
1.算法
2.算法说明
上述算法可以检测到参与死锁的全部进程,包括占有资源和不占有资源的进程
如果希望只检测占有资源的进程,那么初始化时令: finish[i]=true, for allocation[i]=0
令P是所有进程的集合,P’包含于P是所有占有资源进程的集合,那么:P死锁↔P’死锁
死锁检测之后是恢复,只考虑P’中的进程
死锁检测不考虑P-P’中的进程,缩小了检测范围,降低了系统开销
5.8.2 死锁检测时刻
1.考虑因素:
死锁发生频度
死锁影响进程
2.进行死锁检测的时刻
(1)进程等待时检测:发现早,恢复代价小,开销大(overhead)
(2)定时检测
(3)资源(eg. CPU)利用率下降时检测
5.9 死锁的恢复
1.系统重新启动:简单,代价大,涉及未参与死锁的进程
2.终止进程:环路上占有资源的进程
一次性全部终止
逐步终止(优先级,代价函数)
3.剥夺资源+进程回退
select a victim + rollback
保存snapshot(快照)代价大
消除影响困难
starvation
5.10 鸵鸟算法
1.视而不见
(1)Pro:工程师观点
死锁发生频率<<其它故障引起系统瘫痪的频率
死锁处理constant overhead>>死锁危害
(2)Cont:数学家观点
必须处理,无论代价如何
2.目前的系统实际都如此
Eg. UNIX proc结构(50 and up)
5.11 饥饿与活锁
1.饥饿(starvation):当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。饥饿到一定程度的进程所赋予的使命即使完成也不再具有实际意义时称该进程被饿死(starved to death)
2.饥饿 与 死锁
(1)死锁进程处于等待状态,忙式等待的进程并非处于等待状态,但却可能被饿死
(2)死锁进程等待永远不会释放的资源,饿死进程等待可能被释放,但却不会分给自己的资源,其等待时间没有上界
(3)死锁一定发生了循环等待,饿死不然
(4)死锁至少涉及两个进程,饿死进程可能只有一个