内核:处理unix中的死锁

内核:处理unix中的死锁,unix,linux-kernel,deadlock,Unix,Linux Kernel,Deadlock,如果进程1锁定资源A并等待 资源B,同时(由于“正确”位置的上下文切换),进程2锁定资源B并等待访问资源 A Unix如何处理这种死锁?我读了以下内容 许多死锁可以通过简单地要求所有 锁定多个资源,以相同的顺序锁定它们(例如。, 按锁名字母顺序排列) 在不改变执行顺序的情况下,如何更改获取锁的顺序? 有人能详细介绍一下现代Unix内核采用的死锁处理方法吗?不,操作系统不能改变死锁处理的顺序。这句话应该理解为:“如果程序员是明智的,并且在所有竞争实体中以相同的顺序锁定资源,那么许多死锁将是不可能的

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

Unix如何处理这种死锁?我读了以下内容

许多死锁可以通过简单地要求所有 锁定多个资源,以相同的顺序锁定它们(例如。, 按锁名字母顺序排列)

在不改变执行顺序的情况下,如何更改获取锁的顺序?
有人能详细介绍一下现代Unix内核采用的死锁处理方法吗?

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

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


它使用的技术是lockdep,这是一种运行时锁定正确性验证器。有关详细信息,请查看内核文档。

这更有意义,但在某些情况下,锁定不能按相同的顺序进行,并且存在这种死锁的可能性。在这种情况下,内核如何处理死锁?@Cthulhu据我所知,现代Unix内核(Linux&BSD)并不真正处理死锁。我可能错了,因为Solaris不会改变或防止用户区代码中的死锁。dtrace工具(Gregg和Mauro)可以显示信号量和互斥量等对象的状态。这些对象状态的逻辑意义取决于程序员而不是操作系统。这种死锁也不能是间歇性的,因为如果某些上下文在某些时间切换。如果这是真的,那么解决僵局将非常困难