# 2. 解释 MESI 协议中 Modified/Exclusive/Shared/Invalid 四种状态的语义? A E 是脏的,M 是干净的 B E 是共享的 C E 是唯一副本且干净,M 是唯一副本且已修改 ✓ 正确答案 D 两者相同
# 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 分支预测
# 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 数组不缓存
# 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))] 固定布局与对齐 ✓ 正确答案