死锁条件(科夫曼条件)
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个条件都满足,但仍然没有死锁。所以要视情况而定。
[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个条件都满足,但仍然没有死锁。所以要视情况而定。