这是一个面试问题。
如何检测并查明程序是否处于死锁状态?是否有一些工具可用于在Linux / Unix系统上执行此操作?
我的想法:
如果程序没有进展且状态正在运行,则表示死锁。但是,其他原因也可能导致这个问题。开源工具是valgrind(halgrind)可以做到的。对?
答案 0 :(得分:5)
如果您怀疑死锁,请执行ps aux | grep <exe name>
,如果在输出中,则PROCESS STATE CODE
为D
(不间断睡眠)意味着它是死锁。
因为正如@daijo解释的那样,说你有两个线程T1
&amp; T2
以及两个关键部分均受semaphores S1 & S2
保护,如果T1
获得S1
而T2
获得S2
,之后他们会尝试获取ps aux | grep <exe name>
放弃他们已经持有的那个之前的其他锁定,这将导致死锁,并且在进行process state code
时,D
将是ps aux
(即不间断睡眠)。
工具强>
Valgrind,Lockdep(linux内核实用程序)
检查此链接有关死锁的类型以及如何避免它们: http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
修改:D
输出{{1}}“可能”意味着进程处于死锁状态,来自此redhat doc:
不间断睡眠状态
不间断睡眠状态就是其中之一 不会立即处理信号。它只会因此而被唤醒 等待资源变得可用或在超时之后 在等待期间发生(如果在进程中指定了超时) 睡着了。)
答案 1 :(得分:3)
我建议你看一下Helgrind: a thread error detector。
这种问题的最简单的例子如下。
想象一下共享资源R,无论出于什么原因,它都由两个锁L1和L2保护,这两个锁必须在访问R时保持。
假设一个线程获取L1,然后获取L2,并继续访问R.这意味着程序中的所有线程必须先按顺序获取两个锁,然后是L1。不这样做会导致陷入僵局。
如果两个线程 - 称为T1和T2 - 都想要访问R,则可能发生死锁。假设T1首先获取L1,T2首先获取L2。然后T1尝试获取L2,T2尝试获取L1,但这些锁都已被保持。所以T1和T2陷入僵局。“