1. MESI协议基础:定义与四种状态详解
MESI协议是缓存一致性协议中最经典的“写失效”协议,其名称来源于缓存行(Cache Line)可能处于的四种状态:Modified(修改)、Exclusive(独占)、Shared(共享)、Invalid(无效)。在ARM多核处理器中,MESI协议及其变体(如MOESI、MESIF)是保证多核共享内存数据一致性的核心机制。
核心目标:确保每个核私有的Cache中,对同一内存地址的副本数据保持一致。当一个核修改了某个缓存行,其他核必须感知到这一变化,避免读取到过时的“脏数据”。
1.1 四种状态定义
每个缓存行除了存储数据(Data)和标签(Tag)外,还维护一个两位的状态位,用于标识该行在MESI协议中的当前状态。下表详细对比了四种状态的核心特征:
| 状态 | 缩写 | 数据有效性 | 数据唯一性 | 数据与主存一致性 | 是否可写 |
|---|---|---|---|---|---|
| Modified | M | 有效 | 唯一副本 | 不一致(脏数据) | 是(直接写,无需总线事务) |
| Exclusive | E | 有效 | 唯一副本 | 一致(干净数据) | 是(直接写,无需总线事务) |
| Shared | S | 有效 | 可能存在多个副本 | 一致(干净数据) | 否(写前需发总线请求) |
| Invalid | I | 无效 | 无副本 | 不适用 | 否(需先读入数据) |
ARM移植要点:在ARM Cortex-A系列处理器中,MESI协议通常与ACE(AXI Coherency Extensions)总线协议配合使用。E状态在ARM架构中有时被称为“Unique”或“Exclusive”,其核心价值在于允许单核在无竞争时进行“零开销”写操作,避免不必要的总线广播。
1.2 状态转换与总线事务
MESI协议的状态转换由两类事件驱动:本地请求(本核CPU发起的读/写操作)和总线监听(其他核通过总线发起的读/写请求)。下图展示了四种状态之间的核心转换路径:
1.3 四种状态的行为细节
1.3.1 Modified (M) 状态
- 特征:缓存行中的数据已被本核修改,与主存内容不一致(脏数据)。该缓存行是本Cache的唯一有效副本。
- 写操作:直接写入本地Cache,无需发送总线事务,性能最高。
- 读操作:直接命中,返回本地数据。
- 监听响应:当其他核请求读该行时,本核必须将数据写回主存(Write-Back),然后状态变为Shared或Invalid(取决于协议变体)。
1.3.2 Exclusive (E) 状态
- 特征:缓存行中的数据与主存一致(干净数据),且该行仅存在于本Cache中,其他核无副本。
- 写操作:直接写入本地Cache,状态升级为Modified,无需总线事务。
- 读操作:直接命中。
- 监听响应:当其他核读该行时,状态降级为Shared,数据仍保持干净。
ARM优化技巧:E状态是ARM多核系统中“零开销写”的关键。在Cortex-A76等高性能核中,预取逻辑会尽量将数据以E状态加载到Cache中,为后续可能的写操作预留“快速通道”。
1.3.3 Shared (S) 状态
- 特征:缓存行中的数据与主存一致,且可能在其他核的Cache中也有副本。
- 写操作:必须先发送“读-用于-修改”(Read For Ownership, RFO)总线事务,使其他核的副本失效,然后本核状态升级为Modified。
- 读操作:直接命中。
- 监听响应:当其他核写该行时,本核状态降级为Invalid。
1.3.4 Invalid (I) 状态
- 特征:缓存行中的数据无效,不包含任何有效副本。这是所有缓存行的初始状态。
- 写操作:必须先发送总线读事务,将数据从主存或其他核的Cache中取回,然后执行写操作。
- 读操作:触发Cache缺失(Miss),需要从主存或其他核获取数据。
- 监听响应:不参与监听,因为本行无效。
1.4 总线事务类型
MESI协议通过以下三种核心总线事务实现状态协调:
| 事务名称 | 缩写 | 触发条件 | 行为描述 |
|---|---|---|---|
| BusRd | 总线读 | 本地Cache读缺失 | 请求从主存或其他Cache读取数据;其他核若持有M状态数据,需写回并提供数据。 |
| BusRdX | 总线读独占 | 本地Cache写缺失或S状态写 | 请求读取数据并获取独占权;其他核必须使自己的副本失效。 |
| BusUpgr | 总线升级 | E状态写 | 通知其他核本行即将被写,其他核若持有S状态副本需失效。无需传输数据。 |
ARM移植常见陷阱:在ARMv8-A架构中,BusRdX和BusUpgr事务在ACE总线上的实现细节不同。BusUpgr事务不携带数据,仅发送地址和信号,因此总线带宽占用更小。但若系统误将E状态写触发了BusRdX而非BusUpgr,会导致不必要的总线数据流量,降低性能。移植时务必检查ACE接口的“WriteUnique”信号配置。
1.5 MESI协议在ARM中的适配要点
ARM多核处理器在实现MESI协议时,针对移动设备和嵌入式场景做了以下关键适配:
- 写回策略(Write-Back):ARM默认采用写回+写分配策略,减少总线写流量。M状态数据在替换时写回主存。
- 独占访问指令:ARM提供LDREX/STREX指令对,利用E状态实现原子操作。STREX成功时状态从E升级为M,失败时状态降级为I。
- 窥探过滤器(Snoop Filter):在Cortex-A75/A76等大小核架构中,DSU(DynamIQ Shared Unit)内置窥探过滤器,减少不必要的总线广播,提升E/S状态判断效率。
- MOESI变体:部分ARM处理器(如Cortex-A72)支持MOESI协议,增加O(Owned)状态,允许M状态数据在写回后仍保留在Cache中,减少后续读缺失。