缓存一致性与 False Sharing(MESI/MOESI)

共 28 题
#

1. 给定两核写同一 cache line 的 MESI 状态迁移过程?

A 其他核变 M
B 其他核被 invalidate 变 I,本核变 M ✓ 正确答案
C 其他核变 E
D 其他核不变
#

2. 解释 MESI 协议中 Modified/Exclusive/Shared/Invalid 四种状态的语义?

A E 是脏的,M 是干净的
B E 是共享的
C E 是唯一副本且干净,M 是唯一副本且已修改 ✓ 正确答案
D 两者相同
#

3. 解释 MOESI 中 Owned 状态的工程意义(AMD)?

A 表示已写回
B 表示无效
C 表示独占干净
D 允许脏数据共享,由所有者提供数据,避免写回内存 ✓ 正确答案
#

4. 解释 MOESI(AMD)、MESIF(Intel)相对 MESI 增加了哪个状态?

A Owned
B Exclusive
C Forward(转发者) ✓ 正确答案
D Modified
#

5. 解释 cache coherence 与 memory consistency 的区别?

A consistency 管单地址
B 两者完全相同
C coherence 管多地址
D coherence 管单地址(同一缓存行),consistency 管多地址间的访问顺序 ✓ 正确答案
#

6. 解释 false sharing 在 MESI 下如何导致 cache line 反复 bounce?

A 两核访问同一变量
B 内存不足
C 不同核访问同一 cache line 的不同字段,MESI 以行为单位反复 invalidate 造成 bounce ✓ 正确答案
D 分支预测
#

7. 解释为何 MSI 协议在 Intel CPU 中被 MESI 取代?

A 增加容量
B 更快寻址
C 独占且干净的行写时无需总线事务,可直接 E→M 免费升级 ✓ 正确答案
D 减少状态数
#

8. 解释 MESIF 中 Forward 状态在 Intel 多核中的作用?

A 表示无效
B 指定多个共享副本中唯一转发数据者,避免多响应冲突 ✓ 正确答案
C 表示独占
D 表示脏数据
#

9. 解释为何 AMD Zen 在 16 核内仍能维持 directory-based coherence?

A 硬件更简单
B 更快寻址
C 用目录记录持有者,定向转发/失效,可扩展到更多核 ✓ 正确答案
D 不缓存
#

10. 解释 Java @Contended(Lombok)注解为何能减少 false sharing?

A 自动做缓存行填充,把冲突字段隔离到不同 cache line ✓ 正确答案
B 加快字段访问
C 关闭缓存
D 减少字段数
#

11. 解释 cache line 64B 与 C struct 对齐的关系?

A 使 struct 落在单个 cache line 内,避免跨行访问与伪共享 ✓ 正确答案
B 减小 struct 大小
C 加快编译
D 减少字段
#

12. 解释 cache line padding 在 Disruptor 框架中的应用?

A 减少内存占用
B 隔离高频并发字段到独立缓存行,消除 false sharing ✓ 正确答案
C 加快锁
D 减少字段
#

13. 解释为何 Linux kernel 中链表容器 (container_of) 通常使用 cache line 对齐?

A 减小对象大小
B 加快编译
C 避免跨 cache line 访问、减少 false sharing 与一致性竞争 ✓ 正确答案
D 便于内存回收
#

14. 解释 Java 中 long/double 非原子写为何不是 false sharing 根因?

A 非原子写是 false sharing 的根因
B 非原子写会消除 false sharing
C 非原子写与 false sharing 本质相同,都是缓存行粒度问题
D 两者无关:false sharing 根因是变量共缓存行,非原子写是撕裂读问题 ✓ 正确答案
#

15. 解释 cache line false sharing 对 L3 带宽的消耗曲线?

A 几乎无影响
B 随并发写核数与写频率上升而陡增,可能使 L3 饱和、性能下降 ✓ 正确答案
C 只影响 L1
D 降低带宽
#

16. 解释为何 NUMA 跨 die 的 false sharing 比同 die 严重?

A die 内缓存更大
B 频率更低
C 跨 die 无缓存
D 跨 die 一致性要走慢速、低带宽的互联,bounce 成本高 ✓ 正确答案
#

17. store buffer 与 invalidation queue 如何让 MESI 在本核写后读的可见性上出问题,x86 的 mfence/lfence 与锁前缀如何配合修复?

A 只保证 load 顺序
B 强制 store buffer 与 invalidation queue 生效,保证 load/store 顺序与可见性 ✓ 正确答案
C 只保证 store 顺序
D 关缓存
#

18. MESI 协议的状态转换,Modified/Exclusive/Shared/Invalid 之间的总线事务如何触发?

A 写回
B 读独占(BusRdX),invalidate 其他副本 ✓ 正确答案
C 无事务
D 读请求
#

19. False Sharing 的成因与消除,缓存行填充(padding)与 @Contended 如何起作用?

A 让冲突字段分属不同 cache line,避免互相 invalidate ✓ 正确答案
B 合并字段
C 加快字段访问
D 减少字段数
#

20. 用 perf c2c 如何定位 false sharing 的 cache line 与冲突对(hitm),与 perf top/火焰图定位 CPU 热点有何区别?

A perf c2c 定位缓存一致性冲突(HITM),perf top 定位 CPU 热点 ✓ 正确答案
B 两者相同
C perf top 定位伪共享
D perf c2c 定位内存泄漏
#

21. ARM DynamIQ 的 DSU 与 AMBA CHI 协议如何实现跨核缓存一致性,与 x86 的 snoop 总线方案有何差异?

A 点对点、基于目录/L3 一致性点的请求-响应,避免全广播 ✓ 正确答案
B 广播 snoop
C 无一致性
D 相同
#

22. 解释为何写操作 invalidate 而非 update 为主流协议策略?

A invalidate 更简单
B 一次失效可覆盖后续多次写,按需失效,update 每次写都广播开销大 ✓ 正确答案
C invalidate 更慢
D update 更省带宽
#

23. 解释 POSIX _Alignas 与 __attribute__((aligned(64))) 的差异?

A 两者都是标准
B _Alignas 是 C11 标准,__attribute__ 是 GCC/Clang 编译器扩展 ✓ 正确答案
C 两者都是扩展
D 无关联
#

24. 解释为何 Java volatile 字段在大数组上比 AtomicInteger[] 更易 false sharing?

A AtomicInteger 隔离缓存行
B volatile 保证不共享
C 元素连续存放,可能共享同一 cache line ✓ 正确答案
D 数组不缓存
#

25. 解释 snoop-based 与 directory-based 两种一致性实现差异?

A 实现更简单
B 用目录定向请求,避免广播,可扩展性好 ✓ 正确答案
C 更快
D 无一致性
#

26. 解释为何 std::hardware_destructive_interference_size(C++17)默认 64B?

A 主存大小
B 主流 CPU 的缓存行大小,用于缓存行对齐消除 false sharing ✓ 正确答案
C 寄存器大小
D 页大小
#

27. MOESI 与 MESIF 的区别,Owned/Forward 状态在缓存一致中的作用如何?

A O 是无效
B 两者相同
C O 处理脏共享数据提供者,F 指定干净共享数据的统一转发者 ✓ 正确答案
D F 是脏数据
#

28. 为什么在 Go/Rust 中给高频写字段加 64 字节 padding 能消除伪共享,编译器优化是否可能破坏 padding 布局?

A 依赖默认布局
B 不用 padding
C 关闭编译器
D 用 #[repr(C)] 或 #[repr(align(64))] 固定布局与对齐 ✓ 正确答案