图解CPU缓存一致性问题
产生背景
CPU的读取速度比内存的快,一个快一个慢,就会有矛盾,就会有人想要解决这个矛盾,所以就提出多级缓存来解决,如下图所示。
L1级缓存:分为数据域和程序域。
L2级缓存:二级缓存。
L3级缓存:所有CPU共用。
容量逐级越来越大,读取速度逐级降低。
这里会产生什么问题呢,比如一个数据:x=3;
现在X=3,存在多份,所以就存在了数据一致性。
解决方案
缓存一致性原则:MESI。
Modified: 已修改的
缓存行是dirty,与主存的值不同。如果有别的CPU内核想要读主存这块数据,该缓存行必须回写到主存,状态变成S。
Exclusive:独占的
缓存行只在当前缓存中,且是干净的。缓存数据等于主数据的,当别的缓存读取它的时候,状态为共享。当前写数据,变成已修改状态。
Shared: 共享的
缓存行也存在其他缓存且是干净的,缓存可以在任何时刻被抛弃。
Invalid:失效的
缓存行是失效的
上面四个状态,可以考虑在缓存行里面用两个Bit来实现即可。
上面四个缓存行的相容状态,如下图:
当前缓存被标记成M,其他CPU上的缓存都要变成失效状态。
所以现在的有一种机制就是:你的缓存控制器,除了要管缓存的读写之外,还要监听到其他CPU对缓存的值修改。
MESI协议转换图
终极目标:世界大同