【问题标题】:Kernel: Dealing with deadlocks in unix内核:处理 unix 中的死锁
【发布时间】:2012-12-01 10:46:50
【问题描述】:

如果进程 1 锁定 资源 A 并等待 resource B,同时(由于“正确”位置的上下文切换)进程 2 锁定 resource B 并等待访问 resource 一个

Unix 如何处理这种死锁?我阅读了以下here

许多死锁可以通过简单地要求所有进程来防止 锁定多个资源以以相同的顺序锁定它们(例如, 按锁名称的字母顺序)

如何在不改变执行顺序的情况下改变获取锁的顺序? 有人可以详细说明现代 Unix 内核采用的死锁处理方法吗?

【问题讨论】:

    标签: unix linux-kernel deadlock


    【解决方案1】:

    对于 Linux 内核,它不处理这个问题,因为它不知道如何修复它。相反,它会在运行时检测到这种死锁并报错。

    它使用的技术是lockdep,它是一个运行时锁定正确性验证器,详情请看内核文档Documentation/lockdep-design.txt

    【讨论】:

      【解决方案2】:

      不,操作系统不能更改顺序。这句话应该被理解为:“如果程序员是明智的,并且在所有竞争实体中以相同的顺序锁定资源,那么许多死锁将是不可能的”。

      【讨论】:

      • 这样比较有道理,但是在某些情况下,锁定不能以相同的顺序完成,并且存在这种死锁的可能性。在这种情况下,内核如何处理死锁?
      • @Cthulhu 据我所知,现代 Unix 内核(Linux 和 BSD)并不能真正处理死锁。我可能错了
      • Solaris 不会改变或防止用户态代码中的死锁。 dtrace 工具(Gregg 和 Mauro)可以显示信号量和互斥锁等对象的状态。这些对象状态的逻辑含义取决于程序员而不是操作系统。
      • 这种死锁也不能是间歇性的,因为如果某些上下文在某些时间切换。如果这是真的,那么解决死锁真的很难
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多