内存一致性模型
内存一致性模型规定了并发线程访问共享内存时,读取操作可能观察到的值,并定义了程序员可以依赖的排序保证。
用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
Learn & explore
视频即将推出
Definition
内存一致性模型是对并发执行中读取操作可能返回的值的正式规范,它确定了语言、编译器和硬件必须遵守的内存访问顺序。
Scope
本主题涵盖了一致性模型的整个范围,从顺序一致性到宽松和弱模型,以及先行发生关系和无数据竞争保证、硬件内存排序(如总存储顺序),以及C++和Java的语言级内存模型。它解释了宽松模型存在的原因、栅栏和原子操作如何恢复排序,以及如何对并发内存进行可靠推理。
Core questions
- 程序可以合法观察到哪些内存操作顺序?
- 为什么存在宽松内存模型,它们允许什么?
- 无数据竞争保证如何简化推理?
- 栅栏和原子操作如何强制执行排序?
Key theories
- 顺序一致性
- Lamport定义了顺序一致性,其中多处理器执行必须表现为操作的某种单一交错,该交错尊重每个处理器的程序顺序,这是最强的直观基线模型。
- 宽松一致性和SC-for-DRF保证
- Adve和Gharachorloo解释了宽松模型以及无数据竞争程序表现得如同顺序一致的原则,从而协调了性能与可编程性。
- 语言级内存模型
- Manson、Pugh和Adve使用先行发生关系将Java内存模型形式化,定义了哪些优化是合法的,以及即使是存在竞争的程序也能获得哪些保证。
Clinical relevance
由于多核处理器和优化编译器会重新排序内存操作,语言内存模型对于编写正确、可移植的并发代码至关重要。它们告诉程序员何时需要同步,并定义了库和运行时可以提供的保证。
History
Lamport于1979年将顺序一致性形式化。随着硬件为提高性能而采用宽松排序,Adve和Gharachorloo于1996年的教程对一致性模型领域和无数据竞争框架进行了规范。随后,语言设计者将内存模型构建到规范中,其中Java内存模型(2005年)和C++11内存模型确立了现代方法。
Debates
- 存在竞争的程序的语义
- 一个难题是,对于包含数据竞争的程序,如果存在,应提供哪些保证;语言模型必须防止“凭空出现”的值,同时仍允许激进的编译器和硬件优化。
Key figures
- Leslie Lamport
- Sarita Adve
- Kourosh Gharachorloo
- William Pugh
- Jeremy Manson
Related topics
Seminal works
- lamport1979
- adve1996
- manson2005
Frequently asked questions
- 为什么不是所有系统都只使用顺序一致性?
- 顺序一致性禁止了许多提高性能的编译器和硬件优化,因此大多数实际系统采用宽松模型,并仅在需要时提供同步原语以恢复更强的排序。
- 什么是无数据竞争保证?
- 在许多语言内存模型下,一个不包含数据竞争(所有冲突访问都经过适当同步)的程序,被保证表现得如同内存是顺序一致的。