死锁条件(科夫曼条件)

Deadlock Conditions (Coffman conditions)

[https://en.wikipedia.org/wiki/Deadlock#Necessary_conditions][1]

在这篇维基百科文章中,作者提到要发生死锁,必须满足四个条件(互斥、保持等待、循环等待、无抢占)。如果没有验证,则没有死锁。

我们来看看这个情况

semaphore s(0); // initialized with 0

wait(s);
rest of code...

如我们所见,进程不会取得任何进展,因此死锁的定义是有效的。而没有其他进程可以向 s 发出信号,因此不会验证抢占。但循环等待、h&w 和互斥锁都不是。这种情况是否出现死锁,是否所有条件都得到验证?还是我对死锁的定义有误?

当一个进程p1和第二个进程p2竞争临界区时发生死锁:

p1: wait(Q); wait(S); ...
p2: wait(S); wait(Q); ...
  • 保持并等待:如果进程需要两个信号量如 Q 和 S 去临界区。 p1 获取 Q,p2 获取 S,利用并索取可用的东西。
  • 无预谋:none 进程可以强行停止另一个进程来声明 Q 或 S
  • 互斥:一次只允许一个进程。
  • 循环:p1->p2->p1表示p1等待p2获取S,p2等待p1获取Q。所以其中none将永远成功进入临界区。

有时以上3个条件都满足,但仍然没有死锁。所以要视情况而定。