死锁
文章目录
1 资源
在进程对设备、文件等取得排他性访问权时,可能会出现死锁。把需要排他性使用的对象称为资源(resource)。简单来说就是随着时间推移,必须能获得、使用及释放的任何东西。
可抢占资源可以从拥有它的系统中抢占而不会产生任何副作用,例如存储器。
不可抢占资源是指在不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来。
使用一个资源可抽象表示为:
请求资源、使用资源、释放资源。
2 死锁简介
2.1 定义
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件那么该进程集合就是死锁的。
2.1 资源死锁的条件
互斥条件:每个资源要么分配给一个进程,要么就是可用的。
占有和等待条件:已经得到了某个资源的进程可以再请求新的资源。
不可抢占条件:已经分配给一个进程的资源不能强制性地被抢占,只能被占有它的进程显式地释放。
环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
死锁发生时,以上四个条件一定是同时满足的。
有四种处理死锁的策略:
- 忽略该问题。
- 检测死锁并恢复。
- 仔细对资源进行分配,动态地避免死锁。
- 通过破坏产生死锁的四个必要条件之一,防止死锁产生。
3 鸵鸟算法
最简单的解决方法,忽略该问题。
4 死锁检测和死锁恢复
系统允许死锁发生,当检测到死锁发生后,采取措施进行恢复。
4.1 死锁检测
4.2 死锁恢复
5 死锁避免
6 死锁预防
6.1 破坏互斥条件
若一个资源不被一个进程所独占,则死锁肯定不会产生。通过采用假脱机打印机技术可以允许若干个进程同时产生输出,该模型中唯一真正请求使用物理打印机的进程是打印机守护进程。
6.2 破坏占有并等待条件
只要禁止已持有资源的进程再等待其他资源便可以消除死锁。
一种方法是规定所有进程在开始执行前请求所需的全部资源,若所需全部资源都可用,则将它们分配给此进程。若有一个或多个资源正被使用,则不进行分配,进程等待。
一种方法是当一个进程请求资源时,先暂时释放其当前占用的所有资源,然后再尝试一次获得所需的全部资源。
6.3 破坏不可抢占条件
6.4 破坏环路等待条件
消除环路等待有几种方法。
一种是保证每一个进程在任何时刻只能占用一个资源,若要请求另外一个资源,必须先释放第一个资源。
一种是将所有资源统一编号,进程可以在任何时刻提出资源请求,但所有请求必须按照资源编号的顺序(升序)提出。或者仅要求不允许进程请求比当前所占用资源编号低的资源。
一编号,进程可以在任何时刻提出资源请求,但所有请求必须按照资源编号的顺序(升序)提出。或者仅要求不允许进程请求比当前所占用资源编号低的资源。