如何检测和找出程序是死锁?

时间:2012-02-22 05:55:36

标签: linux multithreading unix multiprocessing deadlock

这是一个面试问题。

如何检测并查明程序是否处于死锁状态?是否有一些工具可用于在Linux / Unix系统上执行此操作?

我的想法:

如果程序没有进展且状态正在运行,则表示死锁。但是,其他原因也可能导致这个问题。开源工具是valgrind(halgrind)可以做到的。对?

2 个答案:

答案 0 :(得分:5)

如果您怀疑死锁,请执行ps aux | grep <exe name>,如果在输出中,则PROCESS STATE CODED(不间断睡眠)意味着它是死锁。 因为正如@daijo解释的那样,说你有两个线程T1&amp; T2以及两个关键部分均受semaphores S1 & S2保护,如果T1获得S1T2获得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陷入僵局。“