死锁条件(科夫曼条件)

时间:2019-12-19 11:49:45

标签: c operating-system deadlock

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

在此Wikipedia文章中,作者提到为了使僵局发生,必须满足四个条件(互斥,保持和等待,循环等待,无先占)。如果没有验证,就不会有死锁。

让我们看看这种情况。

semaphore s(0); // initialized with 0

wait(s);
rest of code...

我们可以看到该过程不会取得任何进展,因此死锁的定义是有效的。尽管没有其他进程可以发出s信号,所以没有验证先占权。但是循环等待,硬件和互斥都不是。在这种情况下是否会出现死锁?是否已验证所有条件?还是死锁的定义我错了?

1 个答案:

答案 0 :(得分:0)

当一个进程p1和第二个进程p2竞争关键部分时发生死锁:

p1: wait(Q); wait(S); ...
p2: wait(S); wait(Q); ...
  • 保持并等待:如果进程需要两个信号量(如Q和S)进入关键部分。 p1获取Q,p2获取S,可用并声明可用的内容。
  • 没有先例:没有一个进程可以强制停止另一个进程声明Q或S
  • 互斥:一次只允许一个进程。
  • circular:p1-> p2-> p1表示p1等待p2获取S,而p2等待p1获取Q。因此,它们都无法成功进入临界区。

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