CPU Cache 与 MESI

CPU 缓存

由于CPU 在计算之前存在取指-->译码-->执行 三个阶段,在计算之前需要将前两步准备好,并且准备好操作数,这样才能够最大效率的利用 CPU,但是CPU 的存储读写速度与主存存在巨大的差距,则引入 cache 来消减这个差距,cache 使用的是 SRAM ,SRAM 是 Static Random Access Memory 静态RAM 集成度高速度快,,他比我们的 主存(DRAM)速度快所以用其来做 CPU L1 L2 L3(速度依次降低) 等缓存

Cache 一致性问题

主存中的内存块是按照缓存行映射加载到 cache 中的,缓存行由 如下接口组成

状态 地址 数据

对于多核 CPU 来说每个核都有自己对应的 L1,L2 缓存,L3共享缓缓存,那同一块内存快就有可能被多个CPU 加载到自己的缓存中进行数据的操作,那就会带来缓存一致性问题,如何保证数据内存快的数据一致是需要解决的问题

MESI 协议缓存一致性解决方案

CPU 修改 cache 中的数据后对数据的处理:

  1. wirte through :每次修改之后立即更新到主存,那每次写共享数据就会导致总线事务,高一致性,但是效率低
  2. wirte back: 每次修改后不会立即更新到主存,而是等缓存行在某个时机的时候写回

上述两种方案多线程环境下都需要处理缓存一致性问题,CPU 处理缓存一致性问题提供两种策略
写失效:一个CPU 修改了数据,则该数据在其他CPU 未失效
写更新:一个CPU 修改了数据,则更新到其他 CPU 的该数据

MESI 协议由 Modify,exclusive,shared, invalid 四种状态,表示 修改,独占,共享,失效

Modify:当前 CPU 有最新数据,其他 CPU 该数据失效,用的就是写失效策略
Exclusive:只有当前 CPU 由数据,其他 CPU 没有该数据 和主存数据一致
Shared:当前 CPU 和 其他 CPU 由共同的数据但和主存一致
Invalid:当前数据为失效,需要从主存读取

由于上述四种状态对其他 CPU 都是可感知的,就可以调整自己对 cache 的操作。


You'll only receive email when they publish something new.

More from qingliu
All posts