第五章 死锁与饿死

文章详细阐述了死锁的概念,包括死锁的四种必要条件和不同类型的死锁,如资源竞争和进程通信引起的死锁。讨论了死锁预防和避免的方法,如预先分配和有序分配策略,并介绍了死锁的检测、恢复机制以及鸵鸟算法。此外,还提到了饥饿与活锁的区别。
摘要由CSDN通过智能技术生成

目录

5.1 死锁的概念

5.2 死锁类型

5.2.1竞争资源引起的死锁

5.2.2进程间通信引起的死锁

5.2.3其他原因引起的死锁

5.3 死锁的条件

5.4 死锁的处理(动静两种)

5.5 资源分配图

5.5.1资源分配图的定义

5.5.2 资源分配图的约简

5.6 死锁预防

5.6.1 预先分配法

5.6.2 有序分配法

5.7 死锁避免

5.8 死锁的检测

5.8.1 死锁检测算法

5.8.2 死锁检测时刻

5.9 死锁的恢复

5.10 鸵鸟算法

5.11 饥饿与活锁


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)死锁至少涉及两个进程,饿死进程可能只有一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渊逸晟黯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值