合这个状态图,我们深入分析 MESI 协议的一些实现细节。
(1)某个 CPU(CPU A)发起本地读请求(Local Read),比如读取某个内存地址的变量,
如果此时所有 CPU 的 Cache 中都没加载此内存地址,即此内存地址对应的 Cache Line 为无效状
态(Invalid),则 CPU A 中的 Cache 会发起一个到 Memory 的内存 Load 指令,在相应的 Cache Line
中完成内存加载后,此 Cache Line 的状态会被标记为 Exclusive。接下来,如果其他 CPU(CPU
B)在总线上也发起对同一个内存地址的读请求,则这个读请求会被 CPU A 嗅探到(SNOOP),
然后 CPU A 在内存总线上复制一份 Cache Line 作为应答,并将自身的 Cache Line 状态改为
Shared,同时 CPU B 收到来自总线的应答并保存到自己的 Cache 里,也修改对应的 Cache Line
状态为 Shared。
(2)某个 CPU(CPU A)发起本地写请求(Local Write),比如对某个内存地址的变量赋值,
如果此时所有 CPU 的 Cache 中都没加载此内存地址,即此内存地址对应的 Cache Line 为无效状
态(Invalid),则 CPU A 中的 Cache Line 保存了最新的内存变量值后,其状态被修改为 Modified。
随后,如果 CPU B 发起对同一个变量的读操作(Remote Read),则 CPU A 在总线上嗅探到这
个读请求以后,先将 Cache Line 里修改过的数据回写(Write Back)到 Memory 中,然后在内存
总线上复制一份 Cache Line 作为应答,最后将自身的 Cache Line 状态修改为 Shared,由此产生
的结果是 CPU A 与 CPU B 里对应的 Cache Line 状态都为 Shared
链接:https://pan.baidu.com/s/1FEoLtB2gxL2JXcMnTmbyZQ?pwd=hiy4
提取码:hiy4