多个进程都在等待对方释放锁,从而无法运行的现象。
死锁只有同时满足以下四个条件才会发生(但是同时满足这四个条件,并不意味着一定会出现死锁,即四个必要不充分条件):
要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。
Prevention,预防死锁的办法是保证四个条件至少有一个不成立。
Avoidance,在进程申请资源时判断是否会造成死锁,如果会发生死锁,则不分配资源。
银行家算法:当一个进程申请使用资源的时候,银行家算法通过先试探分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。每个进程都需要有每种资源的“已分配资源数”和“仍需资源数”,再结合系统的现有资源数、已分配资源数、可用资源数,即可计算是否安全。
Detection,允许发生死锁,且在检测到死锁发生后启动死锁恢复机制。
每种类型一个资源的检测:这种情况可以根据资源分配图中是否存在环路来判断是否会发生死锁。
每种类型多个资源的检测:可以用类似银行家算法实现。
Recovery。在检测到死锁发生后启动死锁恢复机制。
虽然有这三种应对死锁的手段(预防、避免、检测并恢复),但是实际上大多数操作系统都采用鸵鸟算法,即忽略死锁,并不对其进行处理,原因如下: