内存一致性与缓存一致性


17

确实,顺序一致性是比缓存一致性更强的属性吗?

根据

索林,丹尼尔·J;希尔,马克D;Wood,David A:关于内存一致性和缓存一致性的入门,Morgan和Claypool,2011年

顺序一致性可以描述为(非正式):

顺序一致性内存模型指定系统必须执行所有线程的加载,并以尊重每个线程程序顺序的总顺序存储到所有内存位置。每次加载将按该总顺序获取最新存储的值。

换句话说,系统是顺序一致的,如果给定每个线程的内存事件(加载和存储),我们可以对所有这些事件进行排序,使得:1)对于每个线程,其事件的顺序得以保留; 2)全局顺序为串行(任何加载都返回存储的最新值)。

现在他们继续并描述连贯性:

的定义的一致性是类似于顺序一致性的定义是一致的系统必须出现来执行所有螺纹的加载和存储到单个存储器位置在共有以便方面每个线程的程序顺序。

换句话说,系统是一致的,如果给定每个位置的每个线程的内存事件,我们可以对该位置的事件进行排序,这样:1)对于每个线程,其事件在该位置的顺序被保留,以及2)对于每个线程位置订单是连续的。

最后,他们指出了区别:

此定义突出了一致性和一致性之间的重要区别:一致性是基于每个内存位置指定的,而一致性是针对所有内存位置指定的。

因此似乎不同之处在于,对于相干系统,我们需要每个位置的所有事件的总顺序(因此,特定位置的事件之间的顺序),而对于一致的系统,应该在所有事件上定义总顺序(因此在不同位置的事件之间也进行排序)?

这是否意味着一致性不如一致性那么严格?(这似乎很有趣!)是否存在连贯但不一致的痕迹?


2
请注意,我们不喜欢“请检查我的答案!”形式的问题。您可以添加一个更具体的问题吗?您觉得自己的差距在哪里?
拉斐尔

@Raphael你说的没错,当我写这个问题时感觉不是很好。但是,如果我无法在Internet上找到答案怎么办(除了模糊的说法,例如“一致性只讲一点点,而不同于一致性只讲所有点”),因此试图找到答案,似乎什么时候发现不确定是否正确。我应该提出一个棘手的问题吗?还是不提供问题的答案?:)
Ayrat 2014年

@Ayrat我阅读了您问题的最后一部分,作为您要检查的答案。如果是这样,您应该确定一些疑问(否则,为什么要问?)。也许我读错了?
拉斐尔

@Raphael'最后一部分要检查'-是的。'为什么这么问?' -这个话题是新话题,我不确定结论是否正确。我将尽力避免将来出现此类问题,并可能会找人检查。)
Ayrat 2014年

Answers:


11

正如您所指出的,一致性是单个存储位置的属性,而一致性是指对所有存储位置的访问顺序。顺序一致性是一个比一致性更严格的属性。也就是说:每个顺序一致的系统在每个内存位置也都保持一致。相反的情况并不正确,在每个位置上都保持一致的内存不一定是顺序一致的。实际上,有很多实际的缓存一致性多处理器,其内存模型只是弱一致性(在某些情况下,不同的处理器观察到对不同位置的访问以不同的顺序发生。)

顺序一致的证明意味着连贯的:

xx

xyx0y0xyxyyx

这可能会导致令人惊讶的结果。例如

initially A=B=0
process 1               process 2
store A := 1            load B (gets 1)
store B := 1            load A (gets 0) 

此跟踪是连贯的:

  • 对于A,顺序为:proc2 loads A(gets 0)proc1 stores A:=1
  • 对于B的顺序是:proc1 stores B:=1proc2 loads B(gets 1)

但这并不一致!由于如果proc2 load B返回1,则proc1 store A := 1已经发生,并且proc2 load A还应该返回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.