Appearance
concepts/memory-ordering/ —— 内存序:多核下看得对不对
总纲:reordering-overview.md —— 先拆清三个层次:编译器重排 ≠ CPU 乱序 ≠ 内存重排。
目录定位
本目录属于知识金字塔 L4 — 内存序层,聚焦多核环境下的访存可见顺序。它与另一条线——单核微架构(microarch/)——是正交但关联的两件事:微架构讲"单核怎么算得快",内存序讲"多核下别的核看到的顺序对不对"。
阅读路径
从上到下,按"谁在重排→发生在哪→如何防御"逐层深入:
bash
reordering-overview.md ← 总纲:三层重排一次性拆清(编译器/CPU乱序/内存重排)
│
├─ compiler-reordering.md ← 编译器重排:-O2 下代码顺序变了
│ 防御:编译器屏障 asm volatile("" ::: "memory")
│
└─ memory-reordering.md ← CPU 内存重排:store buffer + invalidate queue
│ 防御:CPU 内存屏障(mfence/sfence/lfence)
├─ store-buffer.md ← Store Buffer 详解
└─ invalidate-queue.md ← Invalidate Queue 详解
│
└─ memory-order.md ← C++ 语言层视角:acquire/release/seq_cst 语义文档清单
| 文档 | 定位 | 关键问题 |
|---|---|---|
| reordering-overview.md | 总纲:三层重排对照 | 编译器重排、CPU 乱序执行、内存重排——三个完全不同层次的机制,别混 |
| compiler-reordering.md | 编译器重排 | -O2 下编译器如何重排指令、何时不能用 volatile |
| memory-reordering.md | CPU 内存重排 | Store→Load/Store→Store/Load→Load/Load→Store 四种重排模式 |
| store-buffer.md | Store Buffer | CPU 为什么不直接写 cache、store buffer 如何造成 Store→Load 重排 |
| invalidate-queue.md | Invalidate Queue | CPU 为什么不立即处理失效消息、失效队列如何放大重排窗口 |
| memory-order.md | C++ 内存序语义 | relaxed/acquire/release/seq_cst 在硬件上对应什么屏障指令 |
与周边目录的关系
| 相关目录 | 关系 |
|---|---|
| ../microarch/ | 并行线(L4):单核乱序靠 ROB 保序对外不可见,内存重排靠 store buffer/invalidate queue,两者常被混淆 |
| ../cache/ | 上层(L3):MESI 一致性协议是内存重排的硬件基础,理解 store buffer 必须先懂 cache coherence |
| ../../tools/code/ | 观测工具:perf c2c 定位伪共享、perf lock 分析锁竞争 |
一句话总结:内存重排不是 CPU 的 bug,是多核下为性能做的取舍——store buffer 让 CPU 不用等写入完成、invalidate queue 让 CPU 不用等失效确认。代价是多核间看的顺序不再保证和程序序一致,需要内存屏障来收口。