这是一道面试题。
如何检测并确定程序是否陷入死锁?是否有一些工具可用于在 Linux/Unix 系统上执行此操作?
我的想法:
如果程序没有任何进展并且其状态为运行,则为死锁。但是,其他原因也可能导致此问题。开源工具有valgrind(halgrind)可以做到这一点。正确的?
如果您怀疑出现死锁,请执行以下操作ps aux | grep <exe name>
,如果在输出中,PROCESS STATE CODE
is D
(不间断睡眠)意味着这是一个死锁。
因为正如 @daijo 所解释的,假设你有两个线程T1
& T2
和两个关键部分,每个部分受保护semaphores S1 & S2
那么如果T1
获得S1
and T2
获得S2
之后,他们尝试在放弃已经持有的锁之前获取另一个锁,这将导致死锁,并且在执行ps aux | grep <exe name>
, the process state code
将D
(即不间断睡眠)。
Tools:
Valgrind、Lockdep(Linux 内核实用程序)
检查此链接,了解死锁类型以及如何避免死锁:http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
Edit: ps aux
output D
“could”表示进程陷入僵局,由此可知红帽文档 https://access.redhat.com/sites/default/files/attachments/processstates_20120831.pdf:
不间断睡眠状态
不间断睡眠状态是一种
这不会立即处理信号。它只会被唤醒
等待的资源变得可用或超时后
发生在该等待期间(如果在进程时指定了超时)
已进入睡眠状态)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)