Post

MESI Protocol

Introduction about MESI Protocol

介绍

MESI协议是一种广泛使用的缓存一致性协议,用于确保多核处理器系统中各个核心的缓存数据保持一致。它通过四种状态(Modified、Exclusive、Shared、Invalid)和总线嗅探机制,管理缓存行的状态转换,从而避免数据不一致问题。
模拟MESI协议的网址

状态解析

M - Modified表示该数据已被更改,此时缓存内的数据与内存中不一致
E - Exclusive表示该数据仅被当前缓存包含,其他缓存并不包含
S - Shared表示该数据被多个缓存共享。
I - Invalid表示当前缓存中的数据无效

总线嗅探机制

消息类型请求/响应消息描述
Read请求通知其他处理器将要读某个地址,该消息包含数据的地址
Read Response响应该消息内包含了被请求读取的数据。该消息可能是主内存返回的,也可能是其他高速缓存嗅探到Read 消息返回的
Invalid请求通知其他处理器删除指定内存地址的数据副本
Invalidate Acknowledge响应接收到Invalidate消息的处理器必须回复此消息,表示已经删除了其高速缓存内对应的数据副本
Read Invalidate请求此消息为Read 和 Invalidate消息组成的复合消息,主要是用于通知其他处理器当前处理器准备更新一个数据了,并请求其他处理器删除其高速缓存内对应的数据副本。
WriteBack响应消息包含了需要写入内存的数据和其对应的内存地址

Read Invalidate执行过程

总线嗅探(Bus Snooping)中的 Read Invalidate(读-无效)消息 是MESI协议中用于强制获取数据独占权的一种关键总线事务。它的核心目的是允许某个缓存核心在修改数据前,同时完成两个操作:Read(确保拥有最新值)Invalidate(确保独占写入权)

触发条件

当一个核心(例如Core A)需要对某个缓存行执行写入操作,但当前本地缓存的状态可能是InvalidShared两种状态,此时,CoreA需通过总线发送 Read Invalidate 消息,以达成以下目标:

  • 获取最新数据(若其他核心的缓存中存在Modified状态数据);
  • 其他所有缓存中该缓存行的状态必须变为Invalid(失去使用权)。

执行流程

假设Core A需要写入地址X的数据,其本地缓存的X行状态为Shared或Invalid:

  1. 发送Read Invalidate消息
  2. 总线监听(Snooping)
    所有其他核心(如Core B/C/D)监听总线,接收到这个消息后,检查自身是否有地址X的缓存行:
    • 若有Modified状态:
      持有Modified状态的Core(例如Core B)需要将数据写回主存(或直接传给Core A),然后将自身缓存行状态降为Invalid。
    • 若有Shared或Exclusive状态:
      直接将该缓存行标记为Invalid(无需写回主存)。
  3. Core A接收数据:
    • 如果某个核心(如Core B)响应并提供了最新的Modified数据,Core A将数据载入缓存。
    • 如果无核心响应,Core A从主存读取数据。
  4. 更新状态
    Core A将缓存行置为Modified(独占且可修改),其他所有核心对该行的状态均为Invalid。

与普通Read的区别

  • 普通Read请求: 仅请求数据,缓存行进入Shared或Exclusive状态,允许其他核心继续共享。
  • Read Invalidate: 请求数据的同时强制其他核心的副本失效,保证请求者后续的写入操作可直接进行,而无需再次协调其他缓存。
This post is licensed under CC BY 4.0 by the author.