内存以内宽作为单位读写,磁盘以块为单位读写,同样 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 缓存的内存的数据,那么读取其数据,如果其他核心中不存在这份数据,那么通过内存读取。 |