【问题标题】:What are the actions a system can take when a deadlock is detected?当检测到死锁时,系统可以采取哪些措施?
【发布时间】:2012-04-26 19:37:35
【问题描述】:

我在理解如何处理死锁时遇到了一些麻烦。首先,可以采取哪些行动?此外,通常采取什么行动,哪个是“最好的”?谢谢。

【问题讨论】:

    标签: programming-languages operating-system system deadlock


    【解决方案1】:

    嗯,由于停机问题,您不能总是首先检测到死锁。

    但假设您有合理的怀疑已经发生,那么您没有太多选择。你可以:

    • 中断(即发送信号/异常到)所有持有锁的线程。不过,他们必须能够处理由此产生的中断。

    • 杀死所有涉及的线程/进程。这是一个极端的操作,它以牺牲某些数据可能会被程序丢失的风险为代价来节省系统的其余部分。

    【讨论】:

    • 死锁!=无限循环[除非我翻译错误...],因此这不是停机问题。 AFAIK 死锁和数据竞争甚至可以静态发现,但它是 NP-Complete。
    • @amit:检测两个线程是否在等待对方当然很容易,但是你怎么知道第三个线程不打算唤醒它们呢?这显然取决于僵局的类型以及您所做的假设。
    • 如果可以静态完成,也可以通过分析字节码动态完成。我确信可以静态找到数据竞争,并且它是 NP-Complete,我可能被误认为是死锁问题,你能提供减少吗?
    • @Mehrdad AFAIK,如果我们考虑获取排他锁的线程/事务,可以检测到死锁,这是常见的情况。对于其他设置,可能无法检测到死锁,但您的回答给人的印象是死锁检测是不切实际的。
    • IIRC,可以以合理的效率动态地发现死锁——它们由等待图中的循环指示。
    【解决方案2】:

    您在问如何处理死锁。 这不是正确的问题:您应该避免使用它们。确保它们不会发生,因为实际上您的程序无法从它们中恢复。

    【讨论】:

    【解决方案3】:

    你可以杀死一些死锁的任务,并希望其他的可以继续进行,并且不会继续或立即陷入死锁。这不是特别可靠。

    你可以杀死所有死锁的任务。这将释放在没有外部干预的情况下永远不会使用的资源。但是,您的任务现在已经死了 - 如果您重新启动它们,它们没有理由不能再次死锁。

    正如@usr 所说,正确的做法是首先避免死锁。任何潜在的死锁都表明您的系统存在严重缺陷,可能会导致您重新考虑您的设计。

    【讨论】:

      【解决方案4】:

      暂时防止资源陷入死锁进程。 将进程退回到某个检查点,允许抢占所需资源并稍后在检查点重新启动进程。 连续杀死进程,直到系统没有死锁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 2012-08-02
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        相关资源
        最近更新 更多