计算机程序运行时需要调度和使用各种资源,其包括软的资源(如程序代码)和硬的资源(如扫描仪、打印机等)。资源一般可以分两种:可剥夺资源(Preemptable)和不可剥夺资源(Nonpreemptable)。一般来说对于由可剥夺资源引起的死锁可以由系统的重新分配资源来解决,所以一般来说大家说的死锁都是由于不可剥夺资源所引起的。


死锁是指两个或两个以上的进程在执行过程中,因竞争不可剥夺资源而形成的一种互相等待的现象,若无外力作用它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。


死锁的四个必要条件

1.互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

2.请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

3.非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

4.循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。


处理死锁的策略

在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。因此,对资源的分配要给予合理的规划。

在发生死锁后:

1. 撤消陷于死锁的全部进程;
2. 逐个撤消陷于死锁的进程,直到死锁不存在;
3. 从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
4. 从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态