一、背景
CPU在执行任务时会频繁读写内存中的数据,等待内存数据的读写完成是耗时操作,会拖慢CPU的运行速度。
所以一般在CPU上都集成了比内存更快的高速缓存。CPU会尽量多与高速缓存打交道,即将数据从主内存加载到缓存,后续对这个数据的操作在缓存内进行,再适时将缓存数据刷入主内存,以此提高CPU任务执行效率。
但这也带来了问题,在多核心的情况下,多核心操作同一数据时都将数据加载到自己的缓存中,后续某个核心对该数据的修改在刷入主内存前对其它核心是不可见的,这就带来了一致性问题。
缓存一致性协议就是为了解决这种问题发明的,MESI协议是支持写回(write-back)缓存的常用协议, 也称为伊利诺伊协议。现代CPU使用的缓存一致性协议很多都是在MESI的基础上发展而来的。
二、原始MESI解读
1.四种状态
MESI协议中,缓存有四种状态:
-
M(modified) 已修改: 缓存行已被修改
-
E(exclusive) 独占: 缓存行只被该核心缓存(因为是独占的,修改数据不需要问其它核心)
-
S(shared) 共享: 缓存行被多个核心缓存(不能直接写,需要通知其它核心)
-
I(invalid) 失效: 缓存行失效(读取时要从其它缓存或主内存读)
2.两类请求
(1)处理器读写请求
一类是处理器对缓存的请求,包括读请求和写请求。
-
PrRd:处理器请求读缓存。
-
PrWr:处理器请求写缓存。
(2)总线请求
处理器之间、处理器与主内存之间通过Bus(总线)交换事件和数据。
-
Bus:可以理解为多核心之间、核心与内存之间交流的一个通道。
-
Bus Snooping:用来监听总线事件。
前面提到的处理器对缓存的读、写请求会根