3. Cache 一致性基础:MESI 协议、MOESI、共享与独占状态
3.1 从一致性问题说起
多核 CPU 里,每个核心都有自己的 L1/L2 cache。你想想看,如果 Core-0 改了某个地址的数据,Core-1 还在用自己缓存里的旧值,那程序跑出来的结果就是错的。这就是缓存一致性问题。
解决这个问题的核心思路,就是让所有缓存行在任意时刻都处于一个「大家都能理解」的状态。谁可以写、谁只能读、谁的数据已经失效——这些信息必须用一套统一的规则来管理。MESI 协议就是这套规则里最经典的一个。
我早期做多核 SoC 验证时,就因为没搞透 MESI 的状态转换,在死锁问题上卡了两周。从那以后我养成了一个习惯:碰到 cache 相关的问题,第一件事就是拿 MESI 状态机画一遍,看每个缓存行到底在哪个状态。
3.2 MESI 的四色牌——四个状态
MESI 用四个状态标记每条缓存行。说白了,每个状态就回答三个问题:这行数据有效吗?我能不能写?别的核有没有副本?
| 状态 | 全称 | 数据有效 | 可写 | 其他核有副本 |
|---|