“为什么缓存一致性(Cache Coherence)中的write serialization 和内存一致性(Memory Consistency)强调的都是『看到的顺序』,而不是『指令执行顺序』和『真正执行内存写入的顺序』”,这涉及抽象模型与物理实现的分离。
因为在多核系统中,“看到了什么值”才是程序行为的决定因素,而真实执行内存写入的时间和顺序是不可观察的内部行为,对程序语义没有直接影响。
✅ 所以一致性模型定义的是“看起来像是”什么顺序,而不是“物理上”什么顺序。
现代 CPU 特征:
这些都会导致:
store 先发生,其他线程却看不到;或 load 先发生,看到的不是最新值
因此如果你用「物理访问内存的顺序」来定义一致性,很容易出错,因为这不是可观测行为。
模型 | 本质关注点 | 核心特性 | 重点 | 作用域/主体 |
---|---|---|---|---|
Cache Coherence | 单一地址 | 对同一内存地址的所有写操作(无论来自同一处理器核心还是不同处理器核心)必须被 所有处理器核心 以相同的顺序观察到。 | Write Serialization | 物理处理器核心 |
** Sequential Memory Consistency** | 所有地址 | 任一执行流对任何内存地址的所有读写操作必须被 所有执行流 以相同的顺序观察到,且该顺序需满足特定规则(如各执行流的程序顺序约束)。 | 第一个约束: Program Order Constraint (核心) | 逻辑执行流 (线程) |
Sequential Memory Consistency | 所有地址 | 任一写操作(任意地址)的可见时机必须一致(一旦对某执行流可见,即对所有执行流可见)。 | 第二个约束: Write Atomicity | 逻辑执行流 (线程) |
共同点:
✅ 所以是定义“观测等价”的可见行为,而不是低层真实时间顺序。
假设:
X = 1
r1 = X
物理上:
X
的缓存X=0
虽然写已经发生,但从 CPU1 的角度:
这说明:行为由可见性决定,而不是写入动作本身
内存系统的“顺序”定义的不是物理时间顺序,而是“对各执行流而言的行为顺序(可见性)”,因为这才是影响程序执行结果、数据竞争、同步行为的关键。
或者更精炼一句:
程序不能观察“写什么时候写入了物理内存”,它只能观察“什么时候读到了那个值”。
这就是为什么所有内存模型都强调“看到的顺序”而非“访问顺序”。