因果一致性与顺序一致性有何不同?

时间:2013-06-04 23:59:31

标签: java c algorithm concurrency memory-model

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

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中的代码都会很棒。谢谢。

1 个答案:

答案 0 :(得分:4)

顺序一致性中,所有内存操作都显示到所有节点以某种顺序出现。

因此,在您的示例中,进程1,2,和3 将以相同的顺序看到内存操作。 (4个操作有6个可能的订单,但所有流程都会同意该订单是什么。)

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

  1. 每个人都同意我写的过程发生的顺序和我做的过程相同。
  2. 如果任何进程,i,读取位置x并获取由不同进程j写入的值,那么所有线程都同意进程j对位置x的写入先于进程i读取位置x。
  3. 因为在原始示例中没有读取操作,所以例如,进程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的顺序发生的。

    paper that the Wikipedia page points to给出了一些更有趣的例子(涉及读取)。

    因果记忆本身似乎不太有用。在本文的后面,他们展示了如何实现某种类似于具有因果记忆的障碍(以及辅助过程),但是提到似乎没有任何方便的方法来实现关键部分。

    因此,他们最终会做弱一致的发布一致的内存所做的事情,并添加一个需要按顺序一致的同步原语。