2012-02-22 117 views
3

这是一个面试问题。如何检测并找出程序处于死锁状态?

如何检测并找出程序处于死锁状态?

有没有一些工具可以用来在Linux/Unix上做到这一点?

我的想法:

如果程序不作任何进展,其状态运行,它是死锁。

但是,其他原因也可能导致此问题。

开源工具valgrind(halgrind)可以做到这一点。

对不对?

谢谢

回答

2

我建议你看看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成为陷入僵局。”

4

如果您怀疑死锁,做一个ps aux | grep <exe name>,如果在输出时,PROCESS STATE CODED(不间断睡眠)意味着它是一个僵局。 因为随着@daijo解释,说你有两个线程T1 & T2,并分别由semaphores S1 & S2然后保护两个关键部分,如果T1获得S1T2获得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

+3

不间断睡眠表示等待任何数量的资源,通常是IO - 你如何使用它来解决死锁问题? – excalibur 2016-06-06 19:25:46

相关问题