首页 > 解决方案 > 死锁条件(科夫曼条件)

问题描述

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

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

让我们看看这种情况。

semaphore s(0); // initialized with 0

wait(s);
rest of code...

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

标签: coperating-systemdeadlock

解决方案


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

p1: wait(Q); wait(S); ...
p2: wait(S); wait(Q); ...
  • 等待:如果进程需要两个信号量,如 Q 和 S 才能进入临界区。p1 获取 Q,p2 获取 S,利用并声明可用的东西。
  • no premption:没有进程可以强制停止另一个进程来声明 Q 或 S
  • 互斥:一次只允许一个进程。
  • 循环:p1->p2->p1 表示 p1 等待 p2 获取 S,而 p2 等待 p1 获取 Q。因此它们都不会成功进入临界区。

有时上述三个条件都满足,但仍然没有死锁。所以这取决于情况。


推荐阅读