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)需要对某个缓存行执行写入操作,但当前本地缓存的状态可能是Invalid和Shared两种状态,此时,CoreA需通过总线发送 Read Invalidate 消息,以达成以下目标:
- 获取最新数据(若其他核心的缓存中存在Modified状态数据);
- 其他所有缓存中该缓存行的状态必须变为Invalid(失去使用权)。
执行流程
假设Core A需要写入地址X的数据,其本地缓存的X行状态为Shared或Invalid:
- 发送Read Invalidate消息
- 总线监听(Snooping)
所有其他核心(如Core B/C/D)监听总线,接收到这个消息后,检查自身是否有地址X的缓存行:- 若有Modified状态:
持有Modified状态的Core(例如Core B)需要将数据写回主存(或直接传给Core A),然后将自身缓存行状态降为Invalid。 - 若有Shared或Exclusive状态:
直接将该缓存行标记为Invalid(无需写回主存)。
- 若有Modified状态:
- Core A接收数据:
- 如果某个核心(如Core B)响应并提供了最新的Modified数据,Core A将数据载入缓存。
- 如果无核心响应,Core A从主存读取数据。
- 更新状态
Core A将缓存行置为Modified(独占且可修改),其他所有核心对该行的状态均为Invalid。
与普通Read的区别
- 普通Read请求: 仅请求数据,缓存行进入Shared或Exclusive状态,允许其他核心继续共享。
- Read Invalidate: 请求数据的同时强制其他核心的副本失效,保证请求者后续的写入操作可直接进行,而无需再次协调其他缓存。
This post is licensed under CC BY 4.0 by the author.