首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顺序一致性和因果一致性的复制

顺序一致性和因果一致性的复制
EN

Stack Overflow用户
提问于 2015-05-17 04:28:53
回答 1查看 256关注 0票数 2

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

流程1:

代码语言:javascript
复制
x = 1;
if (y == 0)
  z++;

和流程2:

代码语言:javascript
复制
y = 1;
if (x == 0)
  z++;

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

我知道在顺序一致性中,进程是按程序指定的顺序执行的。我相信在上面的例子中,z的结果在顺序一致性模型中应该是零,因为两个进程按照进程中指定的顺序同时执行。因此,所有if条件都不会被执行。但我不确定。

对于随意的一个,相关的写入在所有进程中都应该是相同的顺序。并发写入可以是不同的顺序。在我们的示例中,我不知道这条规则是如何工作的。

EN

回答 1

Stack Overflow用户

发布于 2015-07-30 12:25:20

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

当然,您最终可能会得到以下结果:

代码语言:javascript
复制
P1: store(x, 1)
P2: store(y, 1)
P1: load(y)     // 1
P2: load(x)     // 1

而且两个处理器都不会递增z。然而,这也是系统完全合理的选择:

代码语言:javascript
复制
P1: store(x, 1)
P1: load(y)     // 0
P1: store(z, z+1)
P2: store(y, 1)
P2: load(x)     // 1

以'z‘结尾设置为1。如果你想要一个确定性的结果,你需要添加锁定。顺序一致的系统确实保证z永远不会是2:没有办法重新排序写入,以便两个进程都加载0值并在不违反顺序一致性的情况下递增z。

相比之下,通常一致的系统不能保证其行为始终与所涉及的读取和写入的单个顺序执行相同。不同的处理器以不同的顺序查看其他人的写操作是完全没有问题的,除非这些写操作通常是相关的。你很可能最终会得到:

代码语言:javascript
复制
// 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。通常的一致性所保证的是第三个进程正在执行:

代码语言:javascript
复制
if (z == 2)
  print(x, y)

永远不会打印0:

  • 如果P3加载/打印x和y,则加载必须发生在其加载z和y之后。如果z的加载看到值2,则它必须发生在P3的本地历史记录中相同的存储和P2的增量之后
  • P1的存储(x,1)必须出现在z的增量之前;类似于P2/y

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30280423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档