谁能解释一下顺序一致性和静态一致性之间的定义和差异?以最愚蠢的形式:|
我读过这个:执行的例子,它是顺序一致但不是静止一致的
但我无法理解顺序和静态一致性本身:(
小智 22
顺序一致性要求操作应按照每个程序中指定的顺序生效.基本上它在每个单独的流程中强制执行程序顺序,并允许所有流程假设它们遵守相同的操作顺序.假设我们有2个进程在队列中排队和出列项q:
P1 -- q.enq(x) -----------------------------
P2 -------------- q.enq(y) ---- q.deq():y --
Run Code Online (Sandbox Code Playgroud)
这不是FIFO队列的预期行为.我们期望将队列出队,因为P1 x在P2排队之前排队y.但是,在顺序一致性模型中允许这种情况,因为顺序一致性不要求所有进程看到的顺序是正确的(实时顺序).有至少一个顺序执行的,可以解释这些结果,一个是:
P2:q.enq(y) P1:q.enq(x) P2:q.deq():y
Run Code Online (Sandbox Code Playgroud)
在此执行中,每个进程按程序顺序执行操作,这意味着每个进程按照它们在每个进程中指定的顺序执行其操作.
静态一致性要求非重叠操作看起来按实时顺序生效,但重叠操作可能会重新排序.因此,静态一致性模型中不允许使用相同的方案,因为我们希望q.enq(x)之前看起来生效q.enq(y),而不是q.deq()返回.静态一致性不一定保留程序顺序.如果并且将是并发(重叠)操作,它们可以被重新排序并且将是静止一致的.xyq.enq(x)q.enq(y)q.deq():y
基本上,一些执行顺序一致但不是静止一致,反之亦然.
小智 2
首先您应该了解什么是程序顺序,从字面上看,它是您期望程序按照指令出现的顺序运行的方式。
但是程序顺序仅适用于单线程程序,如果您有多线程,那么问题就来了,因为程序顺序可能不成立甚至不存在,因为有时您无法判断哪个线程的方法调用先发生。
静态一致性描述了所有线程行为的清晰的程序顺序。这是不允许重叠的,因为两个方法调用之间需要有一个静止期。
顺序一致性允许重叠,但要求人们可以找到一种程序顺序,在该顺序中,所有方法调用都可以放置在一个位置,并且仍然返回正确的值并表现正确。