具有顺序和因果一致性的复制

时间:2015-05-16 20:28:53

标签: replication distributed-computing distributed-system consistency eventual-consistency

有两个进程访问共享变量x,y和z。每个进程访问用于保存这些变量的存储的不同副本。 x,y和z的值最初为0。

流程1:

x = 1;
if (y == 0)
  z++;

过程2:

y = 1;
if (x == 0)
  z++;

在完成两个陈述之后,a)顺序和b)临时一致性模型中z的可能值是什么?

我知道在顺序一致性中,进程按程序指定的某个顺序执行。我相信在上面的示例中,z的结果在顺序一致性模型中将为零,因为两个进程按进程中指定的顺序同时执行。因此,没有if条件被执行。但我不确定。

对于偶然的,相关的写入在所有过程中应该是相同的顺序。并发写入可以是不同的顺序。 在我们的示例中,我无法弄清楚此规则的工作原理。

1 个答案:

答案 0 :(得分:1)

顺序一致的系统可以保证其行为始终与所涉及的读取和写入的某些顺序执行相同,这与程序中读取和写入的相对顺序一致处理器正在执行。它不会对不同的处理器执行的两个操作的顺序提供任何保证。

您最终可能会:

P1: store(x, 1)
P2: store(y, 1)
P1: load(y)     // 1
P2: load(x)     // 1

并且两个处理器都不会增加z。但是,对于系统而言,这也是完全合理的:

P1: store(x, 1)
P1: load(y)     // 0
P1: store(z, z+1)
P2: store(y, 1)
P2: load(x)     // 1

使用' z'最终设置为1.如果您想要确定性结果,则需要添加锁定。顺序一致的系统DOES保证z永远不会是2:没有办法重新排序写入,这样两个进程都加载值0并增加z而不违反顺序一致性。

相反,一个因果一致的系统保证其行为总是与所涉及的读写的单个顺序执行相同。对于不同的处理器来说,以不同的顺序查看其他人的写入是完全没问题的,除非这些写入是因果相关的。你很可能最终得到:

// P1's local history
P1: store(x, 1)
P1: load(y)     // 0
P1: store(z, z+1)
P2: store(y, 1)

// P2's local history
P2: store(y, 1)
P2: load(x)     // 0
P2: store(z, z+1)
P1: store(x, 1)

z的最终值为2。确保您是第三个流程执行的因果关系是什么:

if (z == 2)
  print(x, y)

永远不会打印0:

  • 如果P3加载/打印x和y,则必须在加载z
  • 之后发生加载
  • 如果z的负载值为2,则必须在P1和P2的本地历史记录中的P1和P2的增量之后发生
  • P1的商店(x,1)必须出现在z的增量之前;类似地对于P2 / y

通过传递性,包含print语句的P3的任何本地历史必须看到x和y的历史记录。