内存以内宽作为单位读写,磁盘以块为单位读写,同样 cache 的读写是 Cache Line 为单位进行的。

Cache Line 结构如下:

|	Tag	|	Data Block	|

CPU 的 Cache 缓存一般有 3 级

  • L1 Cache:分为数据缓存和指令缓存两部分,每个 CPU 核心单独占用一个 L1 Cache
  • L2 Cache:不区分数据与指令,同样是每个 CPU 核心单独占用一个 L1 Cache
  • L3 Cache:L3 Cache 在所有 CPU 核心之间共享。

CPU 的缓存一致性问题是指同一个内存地址中的数据在不同 CPU 核心的 L1 和 L2 Cache 需要保持一致(在任意时刻 CPU 从中读取的数据是相同的),即写传播和事务的串行化。

MESI 协议

CPU 的缓存一致性是通过 MESI 协议实现的。

MESI 即 Modified Exclusive Shared Invalidated,这也是 MESI 协议规定的 Cache Line 的 4 种状态(CacheLine 已修改,CacheLine 被当前核心独占,CacheLine 被多个核心共享,CacheLine 失效)。

MESI 依赖于总线嗅探(当前核心对 Cache 进行操作时通过总线将这一操作广播给其他核心),依赖总线窥探器实现,核心同样可以请求总线窥探器使其他核心将某一 Cache Line 通过总线发送给自己。

状态 描述
Exclusive 代表当前 Cache Line 对应的内存数据只在当前 CPU 核心的缓存中存在,无需与其他核心的缓存进行同步。但是当其他的核心读取当前 Cache Line 对应的内存数据时,不从内存中读取,而是从 Cache Line 中读取,并且 Exclusive 变为 Shared。
Shared 代表当前所 Cache Line 对应的内存数据在多个 Cache 中同时存在,并且是相同的。
Modified 表示当前核心已经被修改,在弃用前需要写回内存。
Invalidated 当前 Cache Line 是无效的,不应该使用,如果其他核心的 Cache 中存在当前 Cache Line 缓存的内存的数据,那么读取其数据,如果其他核心中不存在这份数据,那么通过内存读取。