死锁的检测与解除
死锁检测与解除
检测死锁不同于预防死锁,不通过预先限制资源访问方式和资源申请来破坏必要条件。OS可以周期性地执行死锁检测例程,单实例资源可检测环路等待,多实例资源还需结合请求和可用资源数量判断。
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
- 撤销进程法(abort):强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
- 进程回退法(rollback):让一个或多个进程回退到足以回避死锁的地步,进程回退时释放相应资源。要求系统保持进程的历史信息,设置还原点。
互动实验
检测环并选择恢复受害者
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
资源类型有多个实例时,为什么只检查资源分配图环不够?
哲学家就餐问题(Dining Philosophers Problem)
之前对于哲学家就餐问题的解决算法可能产生死锁。为了使全部哲学家都能进餐,算法必须避免死锁和饥饿。可行的预防方案是最多只允许4个哲学家同时进餐厅,则至少有1个哲学家可以拿到两根筷子进餐。进餐完毕后放下筷子,其他哲学家就可进餐,这样不会出现五人循环死锁;避免饥饿还需要公平的入场与资源分配。
Semaphore capacity = 4;
Process philosopher(index) {
do {
wait(capacity);
wait(chopstick[index]);
wait(chopstick[(index + 1) % 5]);
eat;
signal(chopstick[(index + 1) % 5]);
signal(chopstick[index]);
signal(capacity);
} while (true);
}动手练习
选择真正破坏环的受害者
P1等P2,P2等P1,P3等P2,相关资源均为单实例。
- 画等待图,区分环内成员与阻塞依赖者。
- 在安全释放假设下比较撤销P3与P1。
- 说明恢复成本及四人入场为何是预防而非事后恢复。