Programming languages 当检测到死锁时,系统可以采取哪些操作?

Programming languages 当检测到死锁时,系统可以采取哪些操作?,programming-languages,operating-system,system,deadlock,Programming Languages,Operating System,System,Deadlock,我在理解如何处理死锁方面有点困难。首先,你可以采取哪些行动?此外,通常采取什么行动,哪一种是“最好的”?谢谢。由于停机问题,您不能总是首先检测死锁 但假设你有合理的怀疑,那你就别无选择了。你可以: 中断(即向持有锁的所有线程发送信号/异常)。不过,他们必须能够处理由此产生的中断 杀死所有涉及的线程/进程。这是一个激烈的操作,它以程序可能丢失某些数据的风险为代价保存了系统的其余部分 您正在询问如何处理死锁这不是正确的问题:你应该避开它们。确保它们不会发生,因为实际上,您的程序无法从它们中恢复。您

我在理解如何处理死锁方面有点困难。首先,你可以采取哪些行动?此外,通常采取什么行动,哪一种是“最好的”?谢谢。

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

但假设你有合理的怀疑,那你就别无选择了。你可以:

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

  • 杀死所有涉及的线程/进程。这是一个激烈的操作,它以程序可能丢失某些数据的风险为代价保存了系统的其余部分


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

      您可以杀死一些死锁的任务,并希望其他任务可以继续执行,而不会保持或立即陷入死锁。这并不特别可靠

      您可以杀死所有死锁的任务。这将释放没有外部干预就永远无法使用的资源。然而,您的任务现在已经死了——如果您再次启动它们,它们就没有理由不能再次死锁


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

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

      死锁!=无限循环[除非我误译了…],因此它不是停止问题。死锁和数据争用即使是静态的也可以找到,但它是NP完全的。@amit:如果两个线程正在等待对方,当然很容易检测出来,但是你怎么知道第三个线程不打算唤醒它们呢?这显然取决于死锁的类型和您所做的假设。如果可以静态地完成,也可以通过分析字节码动态地完成。我确信数据竞争可以静态地找到,它是NP完全的,我可能被误认为是死锁问题,你能提供一个减少吗?@ MeHordad AfEK,如果我们认为线程/事务获取独占锁,可以检测到死锁,这是常见的情况。对于其他设置,死锁可能无法检测到,但您的回答给人的印象是,死锁检测是实用的,而实际上是。IIRC,死锁可以以合理的效率动态发现——它们由等待图中的一个循环表示。我想您会对本文“死锁免疫”感兴趣。这在某种程度上介于预防和处理之间。