有两个进程访问共享变量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条件都不会被执行。但我不确定。
对于随意的一个,相关的写入在所有进程中都应该是相同的顺序。并发写入可以是不同的顺序。在我们的示例中,我不知道这条规则是如何工作的。
发布于 2015-07-30 12:25:20
顺序一致的系统可确保其行为始终与所涉及的读取和写入的某些顺序执行相同,与每个处理器正在执行的程序中的读取和写入的相对顺序一致。它不能保证不同处理器执行的两个操作的顺序。
当然,您最终可能会得到以下结果:
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。如果你想要一个确定性的结果,你需要添加锁定。顺序一致的系统确实保证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:
根据传递性,任何包含print语句的P3本地历史记录都必须看到x和y的本地历史记录。
https://stackoverflow.com/questions/30280423
复制相似问题