Peterson的2进程互斥算法是否考虑到即将终止的进程?


9

我认为在Peterson的互斥算法中,如果首先进入关键部分的过程死亡或被取消,则另一个过程将永远循环,等待进入关键部分。

在图中,如果进程1停止,则进程1后面的其余进程将执行到进程1所在的位置,然后循环执行。

在此处输入图片说明

如果到达关键部分的过程在离开之前先死了,会发生什么?


我相应地编辑了您的问题。由于您没有评论如何将算法扩展到两个以上的流程,因此我更改了问题的那一部分。我认为该问题已经存在于两进程版本中。不过,我仍然完全不了解图片。
拉斐尔

Answers:


1

这取决于锁的实现方式。如果按照Wikipedia文章中的方法进行操作,即在每个进程中用一个布尔值来保护关键部分¹,则肯定会遇到麻烦。如果一个进程死亡,它将永远不会重置其标志,因此另一个进程将永远循环。

在实践中,您可以保护您的代码免受多种死亡之害。例如,采用以下Java风格的实现:

flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
  // critical section
}
finally {
  flag[1] = false;
}

只要系统正在处理错误,这将确保在关键部分发生的任何情况下都将标志重置。在Java中,即使对于堆栈和堆溢出也是如此。因此,除非该过程确实消失(kill²,处理器故障,网络断开等),否则您是安全的。请注意,在这种情况下,大多数非关键软件都会失败-如果未运行,该如何处理错误?-因此在许多情况下必须接受。如有必要,可以在重新启动时处理不一致问题。

如果您使用适当的语言级别的锁,则运行时系统可能会处理消失的锁所有者,即使用死所有者释放锁。您可以通过给每个进程一个死人的开关让其他人可以读取的开关来模拟自己,或者直接检查拥有锁的进程是否仍然存在(如果系统支持)。


  1. 无论如何,这种扩展性不好。
  2. 在Java中,我认为finalize即使在上也应该执行kill,但是规范对此没有保证。kill -9对于任何需要垂死的进程做某事的解决方案,可能都是死刑。

1

查看这些假设,尤其是没有任何过程会无限期地停留在关键部分(当然包括只是要离开)。我认为没有任何方法可以通过任何同步机制解决该普遍问题。

ñ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.