Linux 如何检测并发现程序处于死锁状态?

Linux 如何检测并发现程序处于死锁状态?,linux,multithreading,unix,multiprocessing,deadlock,Linux,Multithreading,Unix,Multiprocessing,Deadlock,这是一个面试问题 如何检测并找出程序是否处于死锁状态?是否有一些工具可以在Linux/Unix系统上实现这一点 我的想法是: 如果程序没有进展,并且其状态为“正在运行”,则为死锁。但是,其他原因也可能导致此问题。开源工具valgrind(halgrind)可以做到这一点。对吧? 我建议你看看 这类问题最简单的例子如下 想象一下某个共享资源R,无论出于何种原因,它由两个锁(L1和L2)保护,当访问R时,这两个锁都必须保持 假设一个线程先获取L1,然后获取L2,并继续访问R。这意味着程序中的所有线程

这是一个面试问题

如何检测并找出程序是否处于死锁状态?是否有一些工具可以在Linux/Unix系统上实现这一点

我的想法是:


如果程序没有进展,并且其状态为“正在运行”,则为死锁。但是,其他原因也可能导致此问题。开源工具valgrind(halgrind)可以做到这一点。对吧?

我建议你看看

这类问题最简单的例子如下

想象一下某个共享资源R,无论出于何种原因,它由两个锁(L1和L2)保护,当访问R时,这两个锁都必须保持

假设一个线程先获取L1,然后获取L2,并继续访问R。这意味着程序中的所有线程都必须按照先获取L1,然后获取L2的顺序获取两个锁。不这样做会导致僵局

如果两个线程(称为T1和T2)都希望访问R,则可能会发生死锁。假设T1首先获取L1,T2首先获取L2。然后T1尝试获取L2,T2尝试获取L1,但这些锁都已被持有。因此T1和T2处于僵持状态。”


如果怀疑出现死锁,请执行
ps aux | grep
,如果在输出中,
进程状态代码
D
(不间断睡眠),则表示出现死锁。 因为正如@daijo所解释的,假设您有两个线程
T1
T2
和两个关键部分,每个部分都受
信号量S1和S2
的保护,那么如果
T1
获得
S1
T2
获得
S2
,然后他们在放弃已经持有的锁之前尝试获取另一个锁这将导致死锁,在执行
ps aux | grep
时,
进程状态代码将为
D
(即不间断睡眠)

工具:

Valgrind,Lockdep(linux内核实用程序)

检查有关死锁类型以及如何避免死锁的链接:

编辑:
ps aux
output
D
“可能”表示进程处于死锁状态,因此:

不间断睡眠状态
不间断睡眠状态就是一种 这不会立刻处理信号,它只会因此而醒来 等待的资源变得可用或在超时后 在该等待期间发生(如果进程运行时指定了超时) (被置于睡眠状态)


“不间断睡眠”意味着等待任意数量的资源,通常是IO——你怎么能用它来实现死锁?@brokenfoot——我同意@excalibur的说法,它在提供的链接中说,进程
可能处于死锁状态。