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