缓存一致性协议MESI和MOESI

本文介绍了计算机系统中的寄存器、缓存和内存的基本概念,重点解析了多核CPU环境下保证缓存一致性的MESI和MESIO协议。MESI协议通过四种状态(Modified、Exclusive、Shared、Invalid)确保缓存数据的一致性,而MESIO协议则增加了Owned状态,优化了数据更新过程,减少了不必要的主内存访问。

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

下面的看法只是本人阅读了一些简单的文献,自己用自己能理解的方式写出来的文章,如果有不对的希望大家指出。我了解这些比较底层的东西只是为了更好的理解JAVA多线程的一些知识,对底层的一些具体实现原理并没有深究(深究也学不会,呃呃)。

1.寄存器、缓存、内存

下图以多CPU的情况举例。

cpu:中央处理器,一台计算机的控制核心和运算核心。

register:通用寄存器,主要存储cpu当次运算所需要使用到的指令集和数据的位置。

引申概念:

地址总线:

数据总线表示cpu的寻址能力,这与寄存器的位数有关,如果寄存器是n位的,那么寻址能力就是2的n次方,他也可以理解为寄存器存储的最大数字。

数据总线:

由地址寄存器指出要存取数据或指令的位置后,接下来就是到该地址把数据或指令找到,并用数据总线传输给CPU。假设数据总线有m位,则传输的数据或指令也有m位。

字长:字长指CPU同一时间内可以处理的二进制数的位数,所以数据总线传输的数据或指令的位数要与字长一致。否则,如果数据总线宽度大于字长则一条数据或指令要分多次传输,则分开传输的几组数据也就没有意义了;如果数据总线宽度小于字长,则CPU的利用率要降低,对资源是种浪费。

我们安装系统的时候就需要先看到自己cpu的位数,然后选择跟cpu位数相同的系统来安装。

cache:缓存,分为三级缓存,不同级别的缓存空间不同,距离CPU的距离也不相同。缓存存在的目的是为了缩短CPU直接访问内存的时间消耗。从缓存里面获取数据要比内存中里面获取数据要很多。

 

### 定义与基本概念 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、付费专栏及课程。

余额充值