缓存一致性协议 MESI 随笔

MESI

MESI 状态机,是对 主存 & 本地CPU & 其他CPU 的内存有效性的描述

状态 描述 监听任务
Modify(M) 该缓存行有效,但是该缓存数据已经被当前核心修改,此时和 主存 中数据不一致。我们将其置为 M,其他的核中缓存行都会置为 I 监听总线上所有对该数据读写 主存 的操作(不希望别人读写),需要将该操作延迟到自己将缓存行写回到主存后变成 S 状态。
Exclusive(E) 该缓存行有效,数据和 主存 的数据一致,数据只存在当前内核工作内存中,只有 本地CPU 在使用、是独占的。 监听总线上所有从 主存 读取该缓存行的操作,一旦有读的,需要将状态置为 S 状态。
Shared(S) 该缓存行有效,不过当前缓存行存在于 主存 & 本地CPU & 其他CPU中,并且值一致。 监听其他的缓存中将该缓存置为 I 或者为 E 的事件,将状态置为 I 状态。
Invalid(I) 表明该缓存行无效,如果想要获取数据的话,就主存 中加载最新的数据 不需要监听。

状态流转

以下是 Core-A(CA)视角的状态状态流转

graph LR

%% 当前cache的内容有效,数据已被修改而且与内存中的数据不一致,数据只在当前cache里存在
mod[Modified]

mod ==>|local read|mod
mod ==>|local write|mod
mod ==>|remote read|sha
mod ==>|remote write|inv

%% 当前cache的内容有效,数据与内存中的数据一致,数据只在当前cache里存在
exc[Exclusive]
exc ==>|local read|exc
exc ==>|local write|mod
exc ==>|remote read|sha
exc ==>|remote write|inv

%% 当前cache的内容有效,数据与内存中的数据一致,数据在多个cache里存在
sha[Shared]
sha ==>|local read|sha
sha ==>|local write|mod
sha ==>|remote read|sha
sha ==>|remote write|inv

%% 当前cache无效
inv[Invalid]
inv ==>|local read| hasmes{别的 cache 是否有 S M E 状态的数据}
hasmes ==> |yes| sha
hasmes ==> |no| exc
inv ==>|local write|mod
inv ==>|remote read|inv
inv ==>|remote write|inv

image-20221021100641590

注意

  • 当有核心读的时候,需要关注其他核心的状态是否有M的,有M的必须要先让M的写入到RAM,再读最新数据。即:当read操作需要到RAM中取时,整个CPU层面不能有该缓存行状态为M的,有的必须让其先写回到RAM中。

  • 当有核心写的时候,涉及会比较多,但是核心就是:写的时候CPU层面不能有任何其他核心处于M状态,有就需要将其先写回RAM,拿到最新的数据修改,修改完成,该核心以外的核都变为失效。

  • 所有的这些操作都是为保证:任何核心的修改不能被覆盖!任何核心的读取,都需要拿到当前CPU缓存层面最新的值!

  • 上面的状态很多都是相互的对应案例,比如CA的remote read,对应这CB的local read。


好好学习,天天向上