一、死锁的概念
什么是死锁
死锁、饥饿、死循环的区别
死锁产生的必要条件
什么时候会发生死锁
死锁的处理策略
知识回顾与重要考点
二、死锁的处理策略——预防死锁
知识总览
破坏互斥条件
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
知识回顾与重要考点
与前面哲学家进餐问题中三种解决死锁的方法对应起来
三、死锁的处理策略——避免死锁
知识总览
什么是安全序列
安全序列、不安全状态、死锁的联系
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。
银行家算法
实际做题(手算)时可用更快速的方法找到一个安全序列:
再看一个找不到安全序列的例子:
接下来看用代码如何实现银行家算法:
知识回顾与重要考点
四、死锁的处理策略——检测和解除
知识总览
死锁的检测
再来看一个不能消除所有边(死锁)的:
最终还连着边的那些进程就是处于死锁状态的进程:此图中,P3进程可以把所有与它相连的边都干掉,所以P3进程不是死锁状态,只有P1和P2是死锁状态的进程
不阻塞:这个进程申请的资源数量足够满足其需求,比如P1进程,P2进程则相反,所以P2进程是一个阻塞的进程
不是孤点:与这个进程至少有一个边相连,所以P1和P2都不是孤点