这是一个维护缓存一致性协议。这个协议不仅可以用在 CPU Cache 之间,也可以广泛用于各种需要使用缓存,同时缓存之间需要同步的场景下。多核 CPU Cache 缓存一致性因为多核 CPU Cache 在 L3 缓存是共享的,所以一致性问题,只会出现在 L1-L2 级这种单核私有缓存的场景中。我们需要有一种机制,来同步两个不同核心里面的缓存数据。这样的机制需要满足两点:第一点叫写传播(Write Propagation)。写传播是说,在一个CPU核心里,我们的Cache数据更新,必须能够传播到其他的对应节点的Cache Line里。
第二点叫事务的串行化(Transaction Serialization),事务串行化是说,我们在一个CPU核心里面的读取和写入,在其他的节点看起来,顺序是一样的。CPU Cache 里做到事务串行化,需要做到两点,第一点是一个 CPU 核心对于数据的操作,需要同步通信给到其他 CPU 核心。第二点是,如果两个 CPU 核心里有同一个数据的 Cache,那么对于这个 Cache 数据的更新,需要有一个“锁”的概念。只有拿到了对应 Cache Block 的“锁”之后,才能进行对应的数据更新。接下来,我们就看看实现了这两个机制的 MESI 协议。
MESI 协议,是一种叫作写失效(Write Invalidate)的协议。在写失效协议里,只有一个 CPU 核心负责写入数据,其他的核心,只是同步读取到这个写入。在这个 CPU 核心写入 Cache 之后,它会去广播一个“失效”请求告诉所有其他的 CPU 核心。其他的 CPU 核心,只是去判断自己是否也有一个“失效”版本的 Cache Block,然后把这个也标记成失效的就好了。MESI协议的由来呢,来自于我们对 Cache Line 的四个不同的标记,分别是:M:代表已修改(Modified) E:代表独占(E__clusive) S:代表共享(Shared) I:代表已失效(Invalidated)我们先来看看“已修改”和“已失效”,这两个状态比较容易理解。所谓的“已修改”,就是我们上一讲所说的“脏”的 Cache Block。Cache Block 里面的内容我们已经更新过了,但是还没有写回到主内存里面。而所谓的“已失效“,自然是这个 Cache Block 里面的数据已经失效了,我们不可以相信这个 Cache Block 里面的数据。
电脑常见英文词汇
parameter list 叁数列 叁数列表
parent class 父类别(或称 base class) 父类
parentheses 小括弧、小括号 圆括弧、圆括号
parse 解析 解析
part 零件 部件
partial specialization 偏特化(ref. C++ Primer 3