1、cacha的一致性
Cache的一致性有这么几个层面
1. 一个CPU的icache和dcache的同步问题
2. 多个CPU各自的cache同步问题
3. CPU与设备(其实也可能是个异构处理器,不过在Linux运行的CPU眼里,都是设备,都是DMA)的cache同步问题
MESI协议定义了4种状态:
M(Modified): 当前cache的内容有效,数据已被修改而且与内存中的数据不一致,数据只在当前cache里存在;
E(Exclusive):当前cache的内容有效,数据与内存中的数据一致,数据只在当前cache里存在;
S(Shared):当前cache的内容有效,数据与内存中的数据一致,数据在多个cache里存在;
I(Invalid): 当前cache无效。
多核Cache一致性由硬件保证,对软件来说是透明的。
2、Cache Line 伪共享
这些变量表面上是不同的变量,但是实际上却存储在同一条 Cache Line 里。
在这种情况下,由于 Cache 一致性协议,两个处理器都存储有相同的 Cache Line 拷贝的前提下,本地 CPU 变量的修改会导致本地 Cache Line 变成 Modified
状态,然后在其它共享此 Cache Line 的 CPU 上,
引发 Cache Line 的 Invaidate 操作,导致 Cache Line 变为 Invalidate
状态,从而使 Cache Line 再次被访问时,发生本地 Cache Miss,从而伤害到应用的性能。
在此场景下,多个线程在不同的 CPU 上高频反复访问这种 Cache Line 伪共享的变量,则会因 Cache 颠簸引发严重的性能问题。
参考文档: