部分内容来源于计算机操作系统 - 死锁
一、死锁概念
- 多个进程对多个互斥的共享资源访问,且相互争夺,且每个进程占有一份资源,在等待其他进程已占有的资源,而其他进程也在等待该进程占有的资源,形成死锁。
- 简单说就是,你占有我想要的资源,我占有你想要的资源,但是我们都只能在获得想要的资源后才能释放当前占有的资源;导致两个都无法进行下一步。
二、死锁条件
- 资源互斥:资源只能同时被一个进程访问;
- 占有和等到条件:已经占有一部分资源,等待下一资源;
- 不可抢占条件:已经占有的资源不能被抢占;
- 循环等待条件:造成循环等待请求资源。
三、鸵鸟算法
- 采用忽略策略,对于死锁进行不处理方式。因为发生死锁的概率非常低,而以高代价的死锁处理算法去处理一个发生概率极低的死锁是非常不划算的。
四、死锁检测与死锁恢复
- 这种方式是允许死锁的发生,并在检测出死锁后,利用一定的方法恢复死锁。
- 每种类型一个资源的死锁检测
- 以每个结点为根结点进行深度优先搜索遍历所有结点,若访问到已经访问过的结点,则检测到死锁。
- 此方法是进程与资源的请求和占用图形成环状就产生死锁;箭头方向一致。
- 每种类型多个资源的死锁检测
- E为目前资源总量,A为资源剩余量,C为当前进程占有量,R为当前进程请求量;
- 由上图可知只有P3进程可以占有资源,执行后释放P1可以占有资源,最后P2可以执行,该例子没有死锁;
- 若当前所有进程都无法得到足够的资源,则发生死锁。
- 恢复方式
- 人为地将资源抢占
- 利用回滚,将进程的状态写入文件以备以后重新启动。
- 杀死进程
五、死锁避免
- 单个资源银行家算法
当进程请求资源时,先检查若分配资源给该进程,是否会进入不安全状态,若会则会进入死锁所以不分配资源给该进程,若分配后是安全状态则分配资源给该进程。 - 多个资源银行家算法
结合多资源死锁检测,若当某一进程的资源请求都小于可用资源量,且当该进程释放后,可用资源满足其他某一进程请求,该情况为安全状态,则可以分配资源给该进程,若分配资源进入不安全状态,则不分配。
六、死锁预防
- 破坏互斥条件
例如打印机采用脱机打印机的方法,放置死锁的发生。 - 破坏占有并等待条件
在进程执行前进行检查,资源是否满足进程执行,若满足则执行,否就不执行。 - 破坏不可抢占条件
可对访问的资源进行虚拟化。 - 破坏循环等待条件
统一给资源编号,按顺序对资源进行访问。