Linux 如何检测并发现程序处于死锁状态?
这是一个面试问题 如何检测并找出程序是否处于死锁状态?是否有一些工具可以在Linux/Unix系统上实现这一点 我的想法是:Linux 如何检测并发现程序处于死锁状态?,linux,multithreading,unix,multiprocessing,deadlock,Linux,Multithreading,Unix,Multiprocessing,Deadlock,这是一个面试问题 如何检测并找出程序是否处于死锁状态?是否有一些工具可以在Linux/Unix系统上实现这一点 我的想法是: 如果程序没有进展,并且其状态为“正在运行”,则为死锁。但是,其他原因也可能导致此问题。开源工具valgrind(halgrind)可以做到这一点。对吧? 我建议你看看 这类问题最简单的例子如下 想象一下某个共享资源R,无论出于何种原因,它由两个锁(L1和L2)保护,当访问R时,这两个锁都必须保持 假设一个线程先获取L1,然后获取L2,并继续访问R。这意味着程序中的所有线程
如果程序没有进展,并且其状态为“正在运行”,则为死锁。但是,其他原因也可能导致此问题。开源工具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
outputD
“可能”表示进程处于死锁状态,因此:
不间断睡眠状态
不间断睡眠状态就是一种
这不会立刻处理信号,它只会因此而醒来
等待的资源变得可用或在超时后
在该等待期间发生(如果进程运行时指定了超时)
(被置于睡眠状态)
“不间断睡眠”意味着等待任意数量的资源,通常是IO——你怎么能用它来实现死锁?@brokenfoot——我同意@excalibur的说法,它在提供的链接中说,进程可能处于死锁状态。