资源分配图算法如何防止死锁?

How Resource Allocation Graph Algorithm can prevent deadlocks?

根据操作系统概念书,资源分配图算法可以防止死锁如下:

如果我们有如下分配图 https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/images/Chapter7/7_07_DeadlockAvoidance.jpg

而P1试图分配资源R2,系统阻止并让其等待,因为这会导致不安全状态。

我的问题如图所示,P2在等待P1释放R1,P1现在在等待分配R2,导致死锁。该算法如何防止此类死锁?

我没有你的书的副本,但我怀疑有错字。这个想法是 return 一个错误(EDEADLOCK)到将完成循环的资源分配请求;从而检测挂起的死锁而不是主动避免它。请求失败的进程仍然需要采取一些纠正措施,例如丢弃所有资源并尝试重新获取它们。

如果您用信号量或互斥锁替换资源,应该清楚,等待不会有任何帮助。

要主动避免死锁,您几乎需要使用信号量集——即获取特定代码路径在一个地方需要的所有锁(请参阅系统 V 信号量)——或安排您的代码以使用特定顺序的锁。后者的一个例子是通过增加地址来分配锁,因此所有参与者都会以相同的顺序尝试分配。对于细粒度的通用代码来说,这两种方法都不实用,但对于事务处理应用程序来说是可能的。