提示: MESI 协议在 MSI 的基础上增加了 E(独占)状态,以减少只有一份缓存的写操作造成的总线通信 。
写缓冲区 & 失效队列MESI 协议保证了 Cache 的一致性,但完全地遵循协议会影响性能 。 因此,现代的 CPU 会在增加写缓冲区和失效队列将 MESI 协议的请求异步化,以提高并行度:
- 写缓冲区(Store Buffer)
- 失效队列(Invalidation Queue)
事实上,写缓冲区和失效队列破坏了 Cache 的一致性 。
因为在未同步的情况下,程序可能会有多种执行顺序 。这也是为什么JAVA里还需要volatile关键字,因为引入写缓冲区或失效队列后就变成弱数据一致性,不能满足 强数据一致性: 保证在任意时刻任意副本上的同一份数据都是相同的,或者允许不同,但是每次使用前都要刷新确保数据一致,所以最终还是一致 。
总结
- 在 CPU Cache 的三级缓存中,会存在 2 个缓存一致性问题:
横向 - 多核心 Cache 的一致性问题: 在一个核心修改 Cache 数据后,如何同步给其他核心 Cache?
- Cache 与内存的一致性问题有 2 个策略:
写回策略: 只有在脏 Cache 块被替换出去的时候写回内存,减少写回内存的次数;
- 多核心 Cache 一致性问题需要满足 2 点特性:
事务串行化(总线仲裁): 各个 CPU 核心所有写入操作的顺序,在所有 CPU 核心看起来是一致 。
- MESI 协议能够满足以上 2 点特性,通过 “已修改、独占、共享、已失效” 4 个状态实现了 CPU Cache 的一致性;
- 现代 CPU 为了提高并行度,会在增加 写缓冲区 & 失效队列 将 MESI 协议的请求异步化, 从内存的视角看就是指令重排,破坏了 CPU Cache 的一致性 。也是为什么使用volatile关键字的原因
推荐阅读
- “CPU烧了”,一家20多口人在烟草工作叫传承?国家出手安抚人心
- Redis数据一致性问题的三种解决方案
- 什么是四代CPU 什么是四代近亲
- 怎么清洗cpu上的风扇 cpu风扇如何清洗
- cpu负载是什么意思 鲁大师显示cpu负载是什么意思
- 大模型时代的下OCR,“CPU味道”更重了
- 苹果手机如何清除浏览器缓存垃圾
- 手机如何清理缓存
- 技嘉g31主板最高装什么cpu 技嘉g31主板
- 笔记本cpu温度过高怎么处理zol问答 笔记本cpu温度高怎么办
