【问题标题】:How to detect and find out a program is in deadlock?如何检测并找出程序处于死锁状态?
【发布时间】:2012-03-12 11:37:51
【问题描述】:

这是一道面试题。

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

我的想法:

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

【问题讨论】:

    标签: linux multithreading unix multiprocessing deadlock


    【解决方案1】:

    如果您怀疑死锁,请执行ps aux | grep <exe name>,如果在输出中,PROCESS STATE CODED(不间断睡眠)意味着它是死锁。 因为正如@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 - 你如何使用它来解决死锁?
    • @brokenfoot - 我同意@excalibur,它在提供的链接中说,进程could 处于僵局。
    【解决方案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 陷入僵局。”

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 2013-11-22
      • 1970-01-01
      • 2020-07-29
      • 2010-11-09
      • 2012-09-06
      • 1970-01-01
      • 2012-01-27
      • 2012-09-05
      相关资源
      最近更新 更多