2

P1 和 P2 是集群中的进程或节点。f1 和 f2 是他们的标志。假设强大的内存模型,并且两个进程都可能在任何时候重新启动,并且重新启动一个进程会清除它的标志,这是我想出的一个算法,但还不能破坏,但这让我很困扰,因为它在理论上没有得到证明并且与彼得森的相比,看起来太简单了。

P1 start:
set f1
if f2 set then clear f1, wait some, goto start
else enter critical section
do whatever
clear f1

P2 start:
set f2
if f1 set then clear f2, wait some, goto start
else enter critical section
do whatever
clear f2

有人能看到流量吗?除了其中一个进程可能会通过快速重新进入该部分而使另一个进程挨饿吗?

4

3 回答 3

5

如果“如果 X 设置然后清除 Y”操作不是原子操作,则存在潜在的竞争条件,可能会阻止其中任何一个进入临界区。我试图概述下面的流程:

P1: set f1
P2: set f2
P1: is f2 set?
P2: is f1 set?
P1: yes, clear f1
P2: yes, clear f2
P1: start wait
P2: start wait
P1: end wait
P2: end wait
P1: goto start
P2: goto start

这可能会永远持续下去,直到任务调度程序完成的分配有所不同,或者两个 P 的等待时间彼此不同。

于 2008-11-18T13:45:13.510 回答
0

好吧,除了饥饿问题,我没有看到任何其他问题。

然而,彼得森的算法保证了公平性——每个进程都保证在下一次可用时立即获得关键部分——你的算法没有提供。

不过,我很好奇您为什么认为彼得森的算法不那么简单;它与你所拥有的并没有什么不同。

P1 start:
set f1
x = 2
while f2 and (x == 2) wait
enter critical section, etc.
clear f1
于 2008-11-18T14:08:42.387 回答
0

很容易证明这个算法保证了互斥。如果两个进程同时处于临界区,则表示两个标志都已设置且 F1 已设置在 F2 之前(来自 P1 的代码),并且 F2 已设置在 F1 之前(来自 P2 的代码)。这是不可能的,所以互斥是有保证的。

它比彼得森的简单,因为它不能保证有界等待 - 来自另一个答案的场景可以无限重复多次,尽管概率很快收敛到零(假设等待期的随机性很好)。

于 2008-11-18T17:13:28.440 回答