内存一致性模型

计算机科学中,一致性模型规定了程序员和系统之间的契约,其中系统保证如果程序员按照规则对内存进行操作,内存将是一致的,读取、写入或更新内存的结果将是一致的。 可预见的。 内存一致性模型用于分布式系统,如分布式共享内存系统或分布式数据存储(如文件系统、数据库、乐观复制系统或网络缓存)。 一致性不同于一致性,一致性发生在有缓存或无缓存的系统中,并且是数据相对于所有处理器的一致性。 Coherence 处理维护全局顺序,在该顺序中,所有处理器都可以看到对单个位置或单个变量的写入。 一致性处理与所有处理器相关的多个位置的操作顺序。

高级语言(例如 C++ 和 Java)通过以保留内存语义的方式将内存操作转换为低级操作、重新排序某些内存指令以及封装所需的与库调用的同步来维护一致性契约。

例子

假设发生以下情况:

  • 行X被复制到节点M和N上
  • 客户端A将行X写入节点M
  • 经过一段时间t,客户端B从节点N读取行X

一致性模型决定了客户端 B 是否一定会看到客户端 A 执行的写入,肯定不会或不能依赖于看到写入。

类型

内存一致性模型定义更新的明显顺序和可见性的规则,并且在权衡的连续体上。 一致性模型的定义和分类有两种方法; 问题和看法。

IssueIssue 方法描述了定义进程如何发出操作的限制。ViewView 方法定义了进程可见的操作顺序。

例如,一致性模型可以定义在所有先前发出的操作完成之前不允许进程发出操作。 不同的一致性模型执行不同的条件。 如果一个一致性模型需要该模型的所有条件甚至更多,则可以认为它比另一个更强大。 换句话说,具有较少约束的模型被认为是较弱的一致性模型。

这些模型定义了硬件需要如何布局,以及在高层次上,程序员必须如何编码。 所选择的模型也会影响编译器如何重新排序指令。 通常,如果控制指令之间的依赖关系以及对同一位置的写入是有序的,则编译器可以根据需要重新排序。 但是,对于下面描述的模型,有些模型可能允许重新排序加载前的写入,而有些则不允许。

强一致性模型

严格一致性

严格一致性是xxx的一致性模型。 在这种模型下,任何处理器对变量的写入都需要被所有处理器立即看到。

严格模型图和非严格模型图描述的是时间约束——瞬时。 可以更好地理解,好像存在一个全局时钟,其中每次写入都应在该时钟周期结束时反映在所有处理器缓存中。 下一个操作必须仅在下一个时钟周期内发生。

这是最严格的模型。 在这个模型中,程序员每次都会收到预期的结果。 它是确定性的。 它的实际相关性仅限于思想实验和形式主义,因为即时消息交换是不可能的。 它无助于回答对同一数据项的并发写入中的冲突解决问题,因为它假定并发写入是不可能的。

顺序一致性

顺序一致性模型是由Lamport(1979)提出的。 它是一种比严格一致性模型更弱的内存模型。 不必立即看到对变量的写入,但是,不同处理器对变量的写入必须以相同的顺序被所有处理器看到。

内存一致性模型

如果任何执行的结果与数据存储上所有进程的(读取和写入)操作都以某种顺序执行的结果相同,并且每个处理器的操作按顺序出现在该序列中,则满足顺序一致性 由其程序指定。 Adve 和 Gharachorloo,1996 定义了实现顺序一致性的两个要求; 程序顺序和写原子性。

  • 程序顺序:程序顺序保证每个进程发出按其程序顺序的内存请求。
  • 写入原子性:写入原子性定义内存请求是根据单个 FIFO 队列的顺序提供服务的。

在顺序一致性中,没有时间或最近写入操作的概念。 有一些操作交错对所有进程都是相同的。

0

点评

点赞

相关文章