cache line优化
CPU 缓存的一点背景知识
现代 CPU 访问内存不是按“字节”访问,而是按 cache line(缓存行) 为最小单位加载的。
典型的 cache line 大小为 64 字节。
当一个线程写入某个地址时,CPU 会把该地址所在的整条 cache line 标记为“已修改 (dirty)”,
并通过硬件的 cache coherence 协议(MESI)
去通知其它 CPU 核心“我改过这个 cache line”。
什么是 “false sharing(伪共享)”
定义:
当多个线程访问不同的变量,但这些变量恰好位于同一个 cache line 上,
CPU 就会把它们当成一个共享单元来同步,
从而导致大量无意义的 cache line 抖动(invalidations)。
举个例子:
假设 cache line 是 64 字节,
而 hazard pointer 是 8 字节的指针:
1 | HP[0] → 属于线程 T1 |
它们可能被编译器紧密排在一起:
1 | |<------ 64B cache line ------>| |
现在:
- T1 不断写
HP[0]; - T2 不断写
HP[1]; - T3 不断读全局 HP 数组。
结果是什么?
虽然每个线程都只修改自己那一小格 8 字节,
但它们都落在同一个 cache line上。
于是每次写入都会触发:
- cache line 在多个核之间来回失效 (invalidate);
- MESI 协议反复转移该行的所有权;
- 造成严重的总线争用和性能下降。
这就是 false sharing(伪共享)。