死锁的定义:
如果一个进程集合中的每个进程都在等待只能由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
死锁的四个必要条件:
1.互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。
2.占有和等待条件。已经得到了某个资源的进程可以再请求新的资源。
3.不可抢占条件。已经分配给一个进程的资源不能强制地被抢占,它只能由被占有它的进程显式地释放。
4.环路等待条件。死锁发生时,系统中一定有由两个或以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
死锁的处理策略:
1.忽略死锁。鸵鸟算法。
2.检测死锁并恢复。让死锁发生,检测它们并解决问题。
3.仔细对资源进行分配,动态避免死锁。
4.通过破坏死锁的四个必要条件之一,防止死锁发生。
鸵鸟算法:
忽略死锁,前提是:宁可在极其偶然的情况下产生死锁,也不愿因为死锁带来不便的限制,不愿意为了避免死锁而带来很大的代价。它在便利性和正确性之间权衡。
死锁检测和死锁恢复:
死锁检测:对系统构造一张资源分配图,如果这张图包含环,那么就存在死锁,环中的每个进程都是死锁进程,反之没有环就没有死锁。可以采用有向图的环检测算法,还有一种方法基于向量比较。
死锁恢复:检测到死锁后,需要从死锁中恢复。主要有以下几种方案:
1 利用抢占恢复
在不通知原进程的情况下,将某一资源从一个进程强行取走给另一个进程使用,接着又送回。可行性取决于资源本身的特性,这种恢复方法通常比较困难或者不可能。
2 利用回退恢复
一旦检测到死锁,就很容易发现需要哪些资源,将拥有这些资源的进程复位到一个更早的状态,那时它还没有取得所需的资源,接着就把这个资源分配给一个死锁进程,如果复位后的进程试图重新获得对该资源的控制,他就必须一直等到该资源可用为止。
3通过杀死进程恢复
杀死环中的一个进程,如果不行就继续杀死别的进程直到打破死锁。另一种办法是牺牲环外的一个进程,释放它的资源,这个进程应该正好持有某些死锁进程所需要的资源。