多处理器一致协议(MSI)协议详细介绍

多处理器一致协议 MSI 协议详细介绍


读操作 写操作 命中-共享S 命中-已修改M 未命中 命中-共享S 命中-已修改M 未命中 其他缓存响应 其他缓存响应 内存或其他缓存响应 开始 缓存行请求 检查本地缓存 检查本地缓存 直接读取 直接读取 发起总线读BusRd 广播无效化Inv, 更新为M 直接写入 发起总线读BusRd 更新本地缓存为S或M 更新本地缓存为I 更新本地缓存为M 结束

什么是 MSI 协议?

MSI(Modified, Shared, Invalid)协议是一种缓存一致性协议,用于在多处理器系统中维护缓存数据的一致性。它通过定义缓存行(cache line)的三种状态来实现这一目标:Modified(已修改)、Shared(共享)和Invalid(无效)。

MSI 协议的状态

MSI协议中,缓存行可以处于以下三种状态之一:

  1. Modified (M) 状态:表示缓存行中的数据已被修改,并且是最新的,其他缓存中没有该数据的副本。
  2. Shared (S) 状态:表示缓存行中的数据是干净的,与内存中的数据一致,并且可能被多个缓存共享。
  3. Invalid (I) 状态:表示缓存行中的数据是无效的,需要从内存或其他缓存中获取最新数据。

MSI 协议的工作原理

MSI协议通过监听总线上的事务来维护缓存一致性。当处理器执行读或写操作时,会根据缓存行的状态和其他处理器的监听响应来更新缓存状态。

  • 处理器读(Read):如果缓存行处于Shared状态,则可以直接读取;如果是Modified状态,可以直接读取且不影响其他缓存;如果是Invalid状态,则需要从内存或其他缓存中读取数据,并更新状态为Shared。
  • 处理器写(Write):如果缓存行处于Modified状态,可以直接写入;如果是Shared状态,则需要先将其他缓存中的相应缓存行置为Invalid,然后再写入;如果是Invalid状态,则需要先从内存中读取数据,然后写入并更新状态为Modified。
  • 总线读(BusRd):当缓存行缺失时,会触发总线读操作,其他处理器需要响应并可能需要更新缓存状态。
  • 总线互斥读(BusRdX):当一个处理器需要独占访问缓存行时,会触发总线互斥读操作,其他处理器需要将相应的缓存行置为Invalid。

MSI 协议的流程

  1. 缓存行请求:当处理器请求一个缓存行时,会检查本地缓存中的状态。
  2. 状态转换:根据请求的类型(读或写)和缓存行的当前状态,处理器会更新缓存行的状态。
  3. 总线事务:如果需要,处理器会发起总线事务,如BusRd或BusRdX,以获取数据或通知其他处理器状态变更。
  4. 响应处理:其他处理器监听总线事务,并根据事务类型和自己的缓存行状态做出响应,可能包括更新自己的缓存行状态或提供数据。

MSI 协议的应用场景

MSI协议适用于那些需要保持缓存一致性的多处理器系统,尤其是在小规模系统中,因为它依赖于总线来广播一致性消息。这种协议简单而有效,但当多个缓存共享同一数据块时,可能会因为多次无效化操作而增加流量负载。

MSI 协议的优势与不足

  • 优势
    • MSI协议通过状态标识和总线事务来有序地维护数据块状态,确保了数据块状态的清晰和一致性。
    • 它可以使用总线或环形网作为一致性事务的广播介质,且硬件实现的MSI协议在功能和可靠性上较为健壮。
  • 不足
    • MSI协议在多个私有缓存中都含有同一个共享数据块时,会进行多次写作废操作,增加流量负载。
    • 总线的带宽有限,扩展性差,且总线上的消息对于一些处理器核来说是不需要的,影响了总线的有效利用率。
相关推荐
CodeWithMe7 小时前
【Note】《深入理解Linux内核》 Chapter 15 :深入理解 Linux 页缓存
linux·spring·缓存
大春儿的试验田9 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
likeGhee9 小时前
python缓存装饰器实现方案
开发语言·python·缓存
C182981825759 小时前
OOM电商系统订单缓存泄漏,这是泄漏还是溢出
java·spring·缓存
西岭千秋雪_12 小时前
Redis性能优化
数据库·redis·笔记·学习·缓存·性能优化
en-route13 小时前
HTTP 缓存
网络协议·http·缓存
虚伪的空想家1 天前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook
苦夏木禾1 天前
js请求避免缓存的三种方式
开发语言·javascript·缓存
重庆小透明1 天前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
Java初学者小白1 天前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存