缓存一致性协议MESI和MOESI

本文深入探讨了在多核处理器环境中,如何通过缓存一致性协议确保高速缓存与主存数据的一致性。介绍了缓存的基本工作原理,详细解释了MESI和MOESI两种协议的运作机制,包括状态描述、状态转换以及监听任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、背景

多核处理器环境下如何保证高速缓存与主存数据保持一致,就引出了缓存一致性协议,该协议的目的就是确保各高速缓存与主存一致性。
在这里插入图片描述

为什么会发明缓存一致性协议,得从计算机结构说起,CPU和内存的交互是最频繁的,然后CPU读写速度远远超过内存的读写速度,如果CPU直接读写内存,则会造成CPU等待成本,即杀鸡焉用牛刀。为了不浪费CPU的处理速度,需要引入高速缓存(CPU>high speed cache>main memory)。

2、计算流程

2.1、带有缓存的CPU计算执行过程

  • 程序以及数据被加载到主内存
  • 指令和数据被加载到CPU的高速缓存
  • CPU执行指令,把结果写到高速缓存
  • 高速缓存中的数据写回主内存(刷新)

在这里插入图片描述

2.2、多级缓存

CPU的运算速度超越了1级缓存的数据I\O能力,CPU厂商又引入了多级的缓存结构。
在这里插入图片描述

3、MESI

状态描述监听任务
M 修改 (Modified)该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。
E 独享、互斥 (Exclusive)该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。
S 共享 (Shared)该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。
无效 (Invalid)该Cache line无效。

状态转换图,这里重点弄清楚各状态间的转移路线。

在这里插入图片描述

状态M、E的cache line只要被远程读后,状态就会转换为S;
状态M、E、S的cache line只要被远程写后,状态就会转换为I;
有效状态M、E、S的本地读,状态维持不变;
有效状态M、E、S的本地写,状态转换为M;
无效状态I本地读写,状态转换为有效状态;

4、MOESI

MOESI协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E、M和I状态和MESI协议的对应状态相同。同时操作相对于MESI多了几种(MESI操作有4种,本地读写、远程读写),MOESI操作有8种(数据拷贝读写、本地副本读写、本地副本读写无数据、从远程CPU获取副本读写)。

O位。O位为1表示在当前Cache 行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他CPU中一定具有该Cache行的副本,其他CPU的Cache行状态为S。如果主存储器的数据在多个CPU的Cache中都具有副本时,有且仅有一个CPU的Cache行状态为O,其他CPU的Cache行状态只能为S。与MESI协议中的S状态不同,状态为O的Cache行中的数据与存储器中的数据并不一致。

S位。在MOESI协议中,S状态的定义发生了细微的变化。当一个Cache行状态为S时,其包含的数据并不一定与存储器一致。如果在其他CPU的Cache中不存在状态为O的副本时,该Cache行中的数据与存储器一致;如果在其他CPU的Cache中存在状态为O的副本时,Cache行中的数据与存储器不一致。

5、参考资料

https://www.cnblogs.com/yanlong300/p/8986041.html

https://blog.youkuaiyun.com/ZoeyyeoZ/article/details/51804647?locationNum=13

https://www.cnblogs.com/dingyingsi/p/3760447.html

https://blog.youkuaiyun.com/Andy2019/article/details/79787888

### 定义与基本概念 MESI MOESI 协议均属于缓存一致性协议,旨在解决多处理器系统中多个缓存之间的数据同步问题。这两种协议基于不同的状态集合设计,分别扩展了缓存行的状态表示方式。 #### MESI 协议定义 MESI 是一种经典的缓存一致性协议,其名称来源于四个可能的缓存行状态:Modified(已修改)、Exclusive(独占)、Shared(共享) Invalid(无效)。每种状态对应特定的行为模式[^1]: - **Modified**: 表示当前缓存行已被修改,且仅存在于本地缓存中。此时,缓存中的数据与主存不同步。 - **Exclusive**: 当前缓存行未被修改,且仅存在于本地缓存中。此状态下,缓存中的数据与主存一致。 - **Shared**: 当前缓存行存在多个缓存副本之间共享。任何对这一缓存行的写操作都会触发广播通知其他缓存更新状态。 - **Invalid**: 缓存行无效,需从主存或其他缓存加载最新数据。 #### MOESI 协议定义 MOESIMESI 的扩展版本,在原有四种状态基础上新增了一个状态——Owner(拥有者),因此得名为 Modified、Owner、Exclusive、Shared Invalid。新增的 Owner 状态允许标记某个缓存作为唯一的数据拥有者,即使该数据在其他缓存中也可能以 Shared 形式存在[^4]: - **Owner**: 此状态表明虽然数据可能是共享的,但只有当前缓存负责处理外部请求。当其他缓存需要最新的数据时,它们可以直接从这个“拥有”的缓存获取,而不是访问主存。 --- ### 工作原理详解 #### MESI 协议的工作流程 1. **读命中**: - 若目标缓存行为 Exclusive 或 Shared,则直接返回数据给 CPU 使用。 - 若为 Invalid,则从主存加载数据到缓存,并将状态设为 Exclusive[^3]。 2. **写命中**: - 若目标缓存行为 Exclusive 或 Modified,则直接修改数据并保持状态不变。 - 若为 Shared,则先发送失效消息给其他缓存使其变为 Invalid,再将状态改为 Modified 并完成写入[^3]。 3. **监听机制**: - 各缓存持续监控总线上发生的事件。例如,当某缓存接收到另一缓存发出的写信号时,它会将自己的相应缓存行置为 Invalid[^1]。 #### MOESI 协议的工作流程 MOESIMESI 基础上增加了 Owner 状态的支持,优化了跨缓存间通信效率: 1. **读命中**: - 类似于 MESI 流程,但如果目标缓存行为 Owner,则优先尝试与其他缓存协商是否可提供更快路径而非每次都回退至主存[^4]。 2. **写命中**: - 对于 Owner 状态下的写操作,除了常规步骤外还需额外考虑如何高效传播变更信息给所有相关方。 3. **监听机制增强**: - 不同之处在于某些情况下可以通过 Owner 缓存快速响应查询需求,减少不必要的全局广播次数从而提升性能表现[^4]。 --- ### 主要区别对比表 | 特性 | MESI | MOESI | |-----------------|-------------------------------|--------------------------------| | 支持的状态数 | 4 种 (M/E/S/I) | 5 种 (M/O/E/S/I) | | 是否支持 Ownership | 否 | 是 | | 性能优化 | 较低 | 高效利用所有权加速数据交换 | | 复杂度 | 简单易实现 | 实现复杂度较高 | --- ### 示例代码模拟两种协议的核心逻辑 以下是简化版伪代码展示两者差异的部分片段: ```python class CacheLine: def __init__(self): self.state = "INVALID" # MESI Protocol Simulation def mesi_update_state(current_state, event_type): if current_state == "EXCLUSIVE": if event_type == "WRITE": return "MODIFIED" elif event_type == "READ_BY_OTHER": return "SHARED" elif current_state == "MODIFIED": if event_type == "INVALIDATE_REQUEST": return "INVALID" # More transitions... return current_state # MOESI Protocol Simulation with OWNER state support def moesi_update_state(current_state, event_type): if current_state == "OWNER": if event_type == "DATA_REQUEST_FROM_ANOTHER_CACHE": return "SHARED" # Provide data directly without going to memory. elif current_state == "EXCLUSIVE": if event_type == "PROMOTE_TO_OWNER": return "OWNER" # Reuse existing MESI logic where applicable... return mesi_update_state(current_state, event_type) # Example Usage line_mesi = CacheLine() line_moesi = CacheLine() print(mesi_update_state(line_mesi.state, "WRITE")) # Output: MODIFIED print(moesi_update_state(line_moesi.state, "PROMOTE_TO_OWNER")) # Output: OWNER ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值