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

use*_*288 7 unix linux multithreading deadlock multiprocessing

这是一个面试问题.

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

我的想法:

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

小智 5

我建议你看看Helgrind: a thread error detection

此类问题的最简单示例如下。

想象一些共享资源 R,无论出于何种原因,它由两个锁 L1 和 L2 保护,当访问 R 时,这两个锁都必须持有。

假设一个线程先获取 L1,然后是 L2,然后继续访问 R。这意味着程序中的所有线程都必须按照先 L1 然后 L2 的顺序获取这两个锁。不这样做可能会导致僵局。

如果两个线程(称为 T1 和 T2)都想访问 R,则可能会发生死锁。假设 T1 先获取 L1,T2 先获取 L2。然后 T1 尝试获取 L2,T2 尝试获取 L1,但这些锁都已被持有。所以T1和T2陷入僵局。”


bro*_*oot 5

如果您怀疑死锁,做一个ps aux | grep <exe name>,如果在输出时,PROCESS STATE CODEIS D(不间断睡眠)意味着它是一个僵局.因为随着@daijo解释,说你有两个线程T1T2每个受保护的两个关键部分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

编辑:ps aux输出D"可能"意味着进程处于死锁状态,来自此redhat doc:

不间断睡眠状态
不间断睡眠状态是指不会立即处理信号的状态.它将仅在等待资源变为可用时或在等待期间发生超时之后(如果在进程进入休眠状态时指定超时)唤醒.

  • 不间断睡眠意味着等待任何数量的资源,通常是IO - 你怎么能用它来解决僵局? (4认同)