如果你对其他操作系统的知识感兴趣,请考虑阅读我的专栏:
【操作系统】
须知
本文仅作学习笔记使用,仅在CSDN网站发布,如果在其他网站发现,均为侵权行为,请举报。作者:小王在努力。
参考资料:《计算机操作系统》 汤小凤 梁红兵 哲凤屏 汤子赢 编著
死锁
- 须知
- 死锁概述
-
- 死锁定义
- 产生死锁的原因
- 产生死锁的必要条件
- 死锁的处理方法
- 预防死锁
- 避免死锁
- 死锁的检测与解除
-
- 死锁检测的方法
- 死锁定理
- 死锁解除的方法
- 后话
死锁概述
死锁定义
死锁是计算机中的一种状态。会因为一些原因,导致程序阻塞,无法继续运行。
产生死锁的原因
产生死锁的两个主要原因:竞争资源和程序推进不当。
产生死锁的必要条件
程序中产生死锁,都会同时具有以下四个条件:
1.互斥条件
2.请求和保持条件
3.不可抢占条件
4.循环等待条件
死锁的处理方法
通常处理死锁的方式有三种:
1.预防死锁
2.避免死锁
3.检测和解除死锁
预防死锁是再程序运行之前进行的处理方法。避免死锁则是在程序运行中解决的。而检测和解除死锁则是在死锁发生后的处理。
预防死锁
在程序运行之前,为了预防产生死锁,我们只需要破坏死锁产生的条件之一即可。
常用的方法有:
1.破坏“请求和保持”条件
2.破坏“不可抢占”条件
3.破坏“循环等待”条件
避免死锁
在程序运行中,为了避免产生死锁,我们会判断系统的是否安全状态,通过使用银行家算法来求出安全序列来保证程序处理安全状态,从而不会出现死锁。
银行家算法举例(注意此处表示有四类资源,每类资源的个数,而不是数字1622):
Process | Allocation | Need | Avaliable |
---|---|---|---|
P0 | 0032 | 0012 | 1622 |
P1 | 1000 | 1750 | |
P2 | 1354 | 2356 | |
P3 | 0332 | 0652 | |
P4 | 0014 | 0656 |
(1)该状态是否安全?
(2)若进程P2提出请求Requset(1,2,2,2)后,系统能否将资源分配给它?
解:
(1)系统是安全的。
根据题意可以得出:
Process | Max(总共需要的资源量) | Allocation(目前已有的资源量) | Need (所需的资源量) | Avaliable (现有的资源量) |
---|---|---|---|---|
P0 | 0044 | 0032 | 0012 | 1622 |
P1 | 2750 | 1000 | 1750 | |
P2 | 36 10 10 | 1354 | 2356 | |
P3 | 0984 | 0332 | 0652 | |
P4 | 066 10 | 0014 | 0656 |
据此表可以推出安全序列为{P0,P3,P1,P2,P4}
具体推理过程如下:
1.如果先对P0进行分配则:Av = 1622 - Need=1 6 2 2 - 0 0 1 2 = 1610
遍历剩下的,1610不足以为下面的资源进行二次分配
程序P0运行完成,释放资源Av = 1610 + Max = 1654
2.从头开始遍历未执行完的程序,通过比较当前Av和Need(if(Av>Need)进行分配;else 跳过),不足以为P1进行分配,不足以为P2进行分配,足以为P3进行分配。
3.对P3进行分配:Av = 1654 - Need = 1002
遍历剩下的,1002不足以为下面的资源进行二次分配
程序P3运行完成,释放资源Av = 1002+Max = 1 9 8 6
4.从头开始遍历未执行完的程序,通过比较当前Av和Need(if(Av>Need)进行分配;
足以对P1进行分配。
5.对P1进行分配:Av = 19 8 6 - Need = 0236
遍历剩下的,0236不足以未下面的资源进行二次分配
程序P1运行完成,释放资源Av = 0236 + Max = 2986
6.从头开始遍历未执行完的程序,通过比较当前Av和Need(if(Av>Need)进行分配;
足以对P2进行分配。
7.对P2进行分配:Av = 2 9 8 6 - Need = 0630
遍历剩下的,0630不足以未下面的资源进行二次分配
程序P2运行完成,释放资源Av = 0630 + Max = 3 12 13 10
8.从头开始遍历未执行完的程序,通过比较当前Av和Need(if(Av>Need)进行分配;
足以对P4进行分配。
9.对P4进行分配:Av = 3 12 13 10 - Need = 3 6 8 4
遍历剩下的,无可分配资源
程序P4运行完成,释放资源Av = 3684 + Max = 3 12 14 14
10.运行完毕,序列为{P0,P3,P1,P2,P4}
(2)先为P2分配1,2,2,2资源之后,剩余的资源量不足以为其他资源进行分配,同时P2资程序也未能执行完毕,不能释放资源,造成死锁,所以不能分配给它。
死锁的检测与解除
死锁检测的方法
我们可以定时或者当资源利用率低的时候进行死锁检测。可以采用的方法有:
资源分配图(图片来自网络,侵权删除)
其中圆圈代表程序;举行代表资源;矩形中的○代表资源的个数。
观察P1,已有两个资源,需要r2的一个资源,并且r2有且分配给P1了,所以P1释放资源。
P2有足够的资源,运行完毕,释放资源。
此处的为:多资源、有环、无死锁。具体的在死锁定理里面有提及。
死锁定理
- 如果每类资源只有一个,那么形成环路之后,必定死锁
- 如果每类资源不只有一个,那么形成环路之后,不一定死锁
- 死锁的充分条件是:资源分配图不可完全简化。
死锁解除的方法
1.回退进程
2.撤销所有进程
后话
- 首先给大家说一下,博主经常在线,如果有什么问题或者想法,可以在下方评论,我会积极反馈的。
- 其次还是要请大家能够多多指出问题,我也会在评论区等候大家!
.