有人能解释一下定义以及顺序一致性和静态一致性之间的差异吗?以最愚蠢的形式:|
我读过这个:Example of execution which is sequentially consistent but not quiescently consistent
但是我无法理解顺序和静态一致性:(
答案 0 :(得分:20)
顺序一致性要求操作看起来按照每个程序中指定的顺序生效。基本上它在每个单独的流程中强制执行程序顺序,并允许所有流程假设它们遵守相同的操作顺序。假设我们有2个进程在队列q
上排队和出列项目:
P1 -- q.enq(x) -----------------------------
P2 -------------- q.enq(y) ---- q.deq():y --
这不是FIFO队列的预期行为。我们期望将x队列化,因为P1会在{@ 1}}入队之前将x
列入队列。但是,在顺序一致性模型中允许这种情况,因为顺序一致性并不要求所有进程看到的顺序是正确的(实时顺序)。有至少一个顺序执行可以解释这些结果,其中一个是:
y
在此执行过程中,每个流程按程序顺序执行操作,这意味着每个流程按照在每个流程中指定的顺序执行其操作。
静态一致性要求非重叠操作看起来按实时顺序生效,但重叠操作可能会重新排序。因此,静态一致性模型中不允许使用相同的方案,因为我们希望P2:q.enq(y) P1:q.enq(x) P2:q.deq():y
显示在q.enq(x)
之前生效,q.enq(y)
返回q.deq()
而不是{{} 1}}。静态一致性也不一定能保持程序顺序。如果x
和y
是并发(重叠)操作,则可以重新排序,q.enq(x)
将保持静态一致。
基本上,有些执行是顺序一致的,但不是静态一致的,反之亦然。
答案 1 :(得分:1)
首先,您应该了解什么是程序顺序,它实际上是您希望程序按照说明的顺序运行的方式。
但是程序顺序只适用于单个线程程序,如果你有多线程程序,那么问题就出现了,因为程序顺序可能不会保持甚至不存在,因为有时你无法分辨哪个线程的方法调用首先发生。
静态一致性描述了所有线程的明确程序顺序'行为。因为在两次方法调用之间需要一个静止期,所以不允许重叠。
顺序一致性允许重叠,但要求人们可以找到一个程序顺序,其中所有方法调用都可以放在一个位置并仍然返回正确的值并且行为正确。