c - 死锁条件(科夫曼条件)
问题描述
[ https://en.wikipedia.org/wiki/Deadlock#Necessary_conditions][1]
在这篇维基百科文章中,作者提到,为了发生死锁,必须满足四个条件(互斥、保持和等待、循环等待、无抢占)。如果没有验证,则没有死锁。
让我们看看这种情况。
semaphore s(0); // initialized with 0
wait(s);
rest of code...
正如我们所看到的,该过程不会取得任何进展,因此死锁的定义是有效的。而没有其他进程可以向 s 发出信号,因此不验证抢占。但循环等待、硬件和互斥都不是。这种情况是否会出现死锁,是否所有条件都得到验证?还是我对死锁的定义有误?
解决方案
当一个进程 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。因此它们都不会成功进入临界区。
有时上述三个条件都满足,但仍然没有死锁。所以这取决于情况。
推荐阅读
- python - 从 IP 地址获取 gTLD 或 ccTLD
- python - 将带有嵌套字典的 json 响应转换为 pandas 数据框
- python - 如何让 .py 文件默认使用 Python Shell 运行?
- java - 为什么不能将另一个泛型类扩展的类作为泛型类传递?
- ffmpeg - 使用 ffmpeg drawtext 突出显示文本中的一些单词
- spring - 如果在 Maven 文件中添加自己的依赖项,Spring Boot REST 端点不起作用
- c# - 在 .Net Core 类库中添加启动类
- networkx - 在示例代码上使用 Networkx 的 RuntimeError
- java - Apache Beam 如何将 TestStream 与文件一起使用
- javascript - 初学者关于JS中递归示例的问题