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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    共 4 条评论
    
  • xzy
    2022-06-23
    在写回策略中主要包括失效和有效两种状态;在写直达策略中又通过引入独占和修改状态,提升了缓存同步的效率。 这个总结写反了吧
    
    1
  • 苏志辉
    2022-01-29
    mesi的右图中,e状态只会产生busrdx不会产生busupgr吧,因为当前是e其他核应该都没有效数据。
    共 1 条评论
    1