共享内存与一致性
共享内存架构允许多个处理器在公共地址空间上操作;内存一致性模型定义了一个处理器的内存操作对其他处理器可见的顺序,这是并行程序所依赖的契约。
用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
Learn & explore
视频即将推出
Definition
内存一致性模型是共享内存系统中跨处理器内存读写操作允许顺序的规范,它定义了加载可能返回的值,从而定义了硬件和并发软件之间的契约。
Scope
本主题涵盖共享内存多处理,以及核心的内存一致性模型:顺序一致性、宽松和弱一致性模型、内存屏障,以及一致性与连贯性之间的关系。它还涵盖了依赖于一致性模型的同步原语。它不包括按位置的连贯性机制(缓存连贯性协议)和核心的芯片级集成(多核和芯片多处理器)。
Core questions
- 并行程序可以假定内存操作的哪些顺序?
- 顺序一致性与宽松一致性模型有何不同?
- 为什么存在宽松模型,以及内存屏障如何恢复所需的顺序?
- 连贯性与一致性如何共同定义正确的共享内存行为?
Key concepts
- 共享地址空间
- 内存一致性模型
- 顺序一致性
- 宽松和弱一致性
- 内存屏障
- 一致性与连贯性
- 同步原语
- 数据竞争
Key theories
- 顺序一致性
- Lamport的顺序一致性要求执行结果如同所有处理器的操作以某种单一的全局顺序交错进行,并且该顺序尊重每个处理器的程序顺序;它直观但限制了硬件优化,从而促使了宽松模型的发展。
Mechanisms
硬件为了性能会重新排序和缓冲内存操作,因此一致性模型规定了哪些重新排序对其他处理器是可见的。顺序一致性禁止跨处理器可见的重新排序;宽松模型允许某些重新排序以提高速度,并要求程序员在需要强制排序的地方插入内存屏障。锁和原子操作等同步原语建立在这些保证之上,避免数据竞争的程序行为是可预测的。
Clinical relevance
内存一致性模型是正确并发编程的基础:它决定了多线程程序可以合法地假定共享更新的可见性和排序。误解它会导致微妙、难以重现的错误,并且语言内存模型(如C++和Java)直接建立在这些硬件概念之上。
History
Lamport于1979年正式提出了顺序一致性。随着硬件在重新排序内存访问以提高性能方面变得越来越激进,宽松一致性模型在1980年代和1990年代在各种架构中激增,这促使人们致力于定义和驯服它们,并最终为编程语言提供了自己明确定义的内存模型。
Debates
- 强一致性与宽松一致性
- 像顺序一致性这样的强模型更容易推理但限制了硬件性能,而宽松模型以增加程序员复杂性为代价实现了优化;该领域通过精心指定的模型和屏障,持续平衡直观语义与效率。
Key figures
- Leslie Lamport
- Sarita Adve
- Mark D. Hill
- David E. Culler
Related topics
Seminal works
- hennessy2019
- culler1999
Frequently asked questions
- 连贯性与一致性有什么区别?
- 连贯性保证所有处理器最终就每个独立内存位置的值达成一致,并以合理的顺序看到对其的写入。一致性管理不同位置之间操作的顺序,正如不同处理器所观察到的那样。一致性模型以连贯性为前提,并增加了跨位置的排序规则。
- 为什么处理器使用宽松内存模型?
- 严格的排序会迫使硬件放弃用于隐藏内存延迟的缓冲和重新排序,从而损害性能。宽松模型允许硬件自由优化,并为程序员提供显式屏障,仅在正确性要求时才强制执行排序。