并发知识 -- 内存模型

本文最后更新于:5 天前

内存模型是什么

为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。

内存模型与处理器、缓存、并发、编译器都有关。它解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。

顺序一致性内存模型

顺序一致性内存模型是一个被计算机科学家理想化了的理论参考模型,它为程序员提供了极强的内存可见性保证。顺序一致性内存模型有两大特性:

  1. 一个线程中的所有操作必须按照程序的顺序来执行。

  2. (不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。

在概念上,顺序一致性内存模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程,同时每一个线程必须按照程序的顺序的顺序来执行内存读/写操作。

其他几种内存模型

Weak Memory Models

最弱的内存模型,四种内存重排都可能出现。

Weak With Data Dependency Ordering

支持Data dependency ordering。也就是禁止对有数据依赖的进行优化

Strong Memory Models

不会出现LoadLoad、StoreStore、LoadStore乱序,但是StoreLoad乱序仍然存在。x86/64系列处理器通常是强序的,这是比较常见的一种内存模型。

Sequential Consistency

上面特别提到过,在这种模型中,四种乱序都不会出现,就好像整个程序的执行被简化为每个线程按照顺序交互地执行有序指令。

Java 内存模型 JMM

JMM 对正确同步的多线程程序的内存一致性做了如下保证:如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)——即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。

具体内容移步另一篇博客