这是一个面试问题。如何检测并找出程序处于死锁状态?
如何检测并找出程序处于死锁状态?
有没有一些工具可以用来在Linux/Unix上做到这一点?
我的想法:
如果程序不作任何进展,其状态运行,它是死锁。
但是,其他原因也可能导致此问题。
开源工具valgrind(halgrind)可以做到这一点。
对不对?
谢谢
这是一个面试问题。如何检测并找出程序处于死锁状态?
如何检测并找出程序处于死锁状态?
有没有一些工具可以用来在Linux/Unix上做到这一点?
我的想法:
如果程序不作任何进展,其状态运行,它是死锁。
但是,其他原因也可能导致此问题。
开源工具valgrind(halgrind)可以做到这一点。
对不对?
谢谢
我建议你看看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成为陷入僵局。”
如果您怀疑死锁,做一个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
不间断睡眠表示等待任何数量的资源,通常是IO - 你如何使用它来解决死锁问题? – excalibur 2016-06-06 19:25:46