9

我知道在顺序一致性中,所有流程都必须按顺序处理。例如:

Process 1     Process 2
x = 1         z = 5
y = 2         p = 3

所以,我们可以得到 x=1, z=5, y=2, p=3 或 z=5, p=3, x=1, y=2。但重要的是 p 只能在 z 执行后才能执行,对吗?

因果一致性呢?我看不出有什么不同。JAVA 或 C 中的任何草图或代码都会很棒。谢谢你。

4

1 回答 1

8

顺序一致性中,所有的内存操作对所有节点来说都是以某种顺序出现的。

因此,在您的示例中,进程 1、2和 3都会以相同的顺序查看内存操作。(这 4 种操作有 6 种可能的顺序,但所有进程都会就该顺序达成一致。)

因果一致性过程中,1、2 和 3 都可以观察到这些写入以不同的顺序发生。有两个规则:

  1. 每个人都同意我写的过程与我写的过程相同。
  2. 如果任何进程 i 读取位置x并获得由不同进程 j 写入的值,则所有线程都同意进程 j 对位置 x 的写入先于进程 i 对位置 x 的读取。

由于在您的原始示例中没有读取操作,因此例如,进程 1 可能认为写入按顺序发生,x=1, y=2, z=5, p=3而进程 2 认为写入按顺序发生,z=5, p=3, x=1, y=2而进程 3 认为写入按顺序发生订购z=5, x=1, p=3, y=2

维基百科页面指向的论文给出了一些更有趣的例子(涉及阅读)。

因果记忆本身似乎不是很有用。在论文的后面,他们展示了如何实现类似于带有因果记忆的屏障(和辅助进程),但提到似乎没有任何方便的方法来实现临界区。

所以他们最终会做弱一致释放一致内存所做的事情,并添加一个同步原语,这需要顺序一致。

于 2013-06-05T01:09:33.197 回答