编程高手必学的内存知识
海纳
华为编译器高级专家,原 Huawei JDK 团队负责人
20674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
编程高手必学的内存知识
15
15
1.0x
00:00/00:00
登录|注册

15 | MESI协议:多核CPU是如何同步高速缓存的?

你好,我是海纳。
上节课,我们学习了为什么要设计缓存,以及缓存和内存的映射方式。你还记得吗?在上节课结束的部分,我讲到了只要数据的访问者和被访问者之间的速度不匹配,就可以考虑使用缓存进行加速。
但是我们知道,天下没有免费的午餐,缓存在带来性能提升的同时,也引入了缓存一致性问题。缓存一致性问题的产生主要是因为在多核体系结构中,如果有一个 CPU 修改了内存中的某个值,那么必须有一种机制保证其他 CPU 能够观察到这个修改。于是,人们设计了协议来规定一个 CPU 对缓存数据的修改,如何同步到另一个 CPU。
今天我们就来介绍在多核体系结构下,如何解决缓存一致性问题。另外,按照从简单到困难的顺序,我还会介绍最简单的 VI 协议和比较完善的 MESI 协议。学习完这节课后,你就知道缓存一致性问题是如何被解决的,还会了解到如何设计协议对缓存一致性进行管理。
在缓存一致性的问题中,因为 CPU 修改自己的缓存策略至关重要,所以我们就从缓存的写策略开始讲起。

缓存写策略

在高速缓存的设计中,有一个重要的问题就是:当 CPU 修改了缓存中的数据后,这些修改什么时候能传播到主存?解决这个问题有两种策略:写回(Write Back)和写直达(Write Through)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

多核CPU中的高速缓存同步问题是一个重要的技术挑战。本文介绍了在多核体系结构下解决缓存一致性问题的相关内容。首先讲解了缓存的写策略,包括写回和写直达,以及写更新和写无效的策略。接着介绍了缓存一致性问题的概念,以及写传播和事务串行化的重要性。最后,详细介绍了基于写直达和写回的缓存一致性协议。通过本文的内容,读者可以快速了解多核CPU中缓存同步的挑战和相关解决方案。 在多核CPU中,缓存一致性问题是由CPU对自己的缓存进行写操作,而未能及时通知到其他CPU所引起的。本文详细介绍了缓存的写策略,包括写回和写直达,以及写更新和写无效的策略。此外,还讨论了在写回策略和写直达策略中,缓存的状态和状态迁移的情况,以及缓存一致性协议的重要性。通过了解这些内容,读者可以更好地理解多核CPU中缓存同步的挑战,并掌握相关解决方案。 总之,本文深入探讨了多核CPU中的高速缓存同步问题及相关解决方案,为读者提供了全面的技术视角和解决思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编程高手必学的内存知识》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • raisecomer
    有一个问题,当IO设备通过DMA通道修改内存数据时,如果这个内存数据刚好被一个CPU已经加载到本地缓存了,也就是内存数据修改的源头不是CPU,那么缓存一致性怎么保证的,也是MESI协议吗?

    作者回复: 这是两个级别的事情。CPU与内存之间打交道,中间会经过缓存。这是一个级别,CPU与外设之间通过DMA通讯,内存做为buffer,这是另外一个级别。你担心的DMA区域的读写冲突,CPU会保证的,CPU把一块内存当做DMA区域之后,这块区域的所有权可以认为是外设的,只有当DMA完成后,外设发起中断通知CPU,这块内存还给你了,CPU再会去读这一块的内容。

    2021-12-08
    7
  • sc
    老师,请问 1. 在 基于“写直达”的缓存一致性协议 中,""“写传播”的缓存一致性的缺点是需要很高的带宽。原因是对于缓存块的每次写入,都会触发 BusWr 从而占用带宽。相反的是,在“写无效”缓存策略下,如果同一个缓存块中的数据被多次写入,只需占用一次总线带宽来失效其他处理器的缓存副本即可。",这个相反的是,说的是什么意思,读了好几次,没有读明白,我理解的是:前面说的是缓存块的每次写入,都会触发 BusWr,后面说的是在写无效策略下,即使每次写入都会触发 BusWr,但是对于 I 状态的缓存块,即使侦听到 BusWr ,也不会有影响,请问老师是这样吗 2. 在最后总结中,说的是 “在写回策略中主要包括失效和有效两种状态;在写直达策略中又通过引入独占和修改状态,提升了缓存同步的效率。”,老师这里是不是写反了,看上面的文章中,应该是写直达只有两种状态,然后在写回中又增加了独占和修改状态。

    作者回复: 1. 写传播不光要告诉其他CPU(比如就是CPU1)那块缓存无效了,还要告诉它新的值是什么。有些时候,CPU1其实并不太需要立即知道那里的值是什么。只需要在CPU1读数据的时候再知道。所以写无效就是通知一下CPU1,你那里的副本失效了啊,你需要的话再来问我要。写传播则是我每一次更新都要把新的值通知给你。这是两者的区别。 2. 这个是确实是笔误,我尽快修复。谢谢。

    2021-12-10
    2
  • 送过快递的码农
    老师,你这边讲的总线上什么总线啊?是cpu内部的总线,还是负责cpu和内存通讯的总线啊?

    作者回复: 我们讲核间通讯,默认就是核间总线了。是cpu内部的。

    2021-12-02
    2
  • shenglin
    还有一个问题,一个 CPU 发起请求的同时,也会产生总线事件,导致其他CPU的缓存的状态改变,这样不是会频繁占用总线带宽?

    作者回复: 必然,所以第16课讲解了一些优化的办法,但这需要软件工程师的配合。

    2021-12-02
  • shenglin
    VI协议的状态机示意图中,右边的情况,当缓存处于valid状态时,收到BusWr事件,此缓存不会产生总线事务,但是会变成invalid状态,示意图的箭头画反了吧,由V指向I?

    作者回复: 是的,已经修复,谢谢。

    2021-12-02
  • 无嘴小呆子
    既然MESI保证CPU缓存一致性了,为何java还要使用volatile关键字呢?就是MESI何时触发老师没有讲解清楚呀!硬件篇应该加上这个吧~

    作者回复: 请读一下第16节课,了解了内存屏障,然后我们会在第18节课再讲Java内存模型。所以volatile需要的前置知识非常多。你可以看一下目录先了解一下后面的课程内容。

    2021-12-02
  • Corner
    所以缓存一致性协议是硬件保证吗?也就是不管你怎么写代码,它都是存在的?

    作者回复: 不一定,学完第16节和第18节课你就明白了,有的CPU,比如x86,它的硬件提供了比较强的缓存一致性支持,但有的CPU,比如Arm,它指供的缓存一致性支持就很弱,这就需要软件工程师在正确的位置插入内存屏障来保证这种一致性。

    2021-12-02
    2
  • springXu
    提个小建议,有没有这个协议的说明资料,比如intel的哪个文档中有这个介绍?又或者是AMD的。能给个链接么?

    作者回复: Wiki吧。因为其实各个CPU的设计都不相同。MESI只是一个基本的总结。Intel和AMD两家使用的核间同步协议都不相同。比如AMD真正使用的是自己改进的版本MOSEI,可以看各家CPU自己的编程手册,例如AMD的:http://developer.amd.com/wordpress/media/2012/10/24593_APM_v21.pdf

    2021-12-01
    4
  • xzy
    在写回策略中主要包括失效和有效两种状态;在写直达策略中又通过引入独占和修改状态,提升了缓存同步的效率。 这个总结写反了吧
    2022-06-23
    1
  • 苏志辉
    mesi的右图中,e状态只会产生busrdx不会产生busupgr吧,因为当前是e其他核应该都没有效数据。
    2022-01-29
    1
    1
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部