• 炎发灼眼
    2019-07-26
    老师,有个问题,如果说一个核心更新了数据,广播失效操作和地址,其他核心的缓存被更新为失效,那更新数据的那个核心什么时候把数据再次写入内存呢,按照上一讲,在下次更新数据的时候才会写入,那如果在这个之间,别的核心需要用到这部分数据,看到失效,还是从内存读,这不是还是读不到最新的数据么。
     11
     16
  • bro.
    2019-07-31
    Java中volatile变量修饰的共享变量在进行写操作时候会多出一行汇编**
        ```
        0x01a3de1d:movb $0×0,0×1104800(%esi);0x01a3de24:lock addl $0×0,(%esp);
        ```
    lock前缀的指令在多核处理器下会:
            1. 将当前处理器缓存行的数据写回到系统内存
            2. 这个写回内存的操作会使其他CPU里缓存了改内存地址的数据无效
    多处理器总线嗅探:
            1. 为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存后在进行操作,但**写回操作**不知道这个更改何时回写到内存
            2. 但是对变量使用volatile进行写操作时,JVM就会向处理器发送一条lock前缀的指令,将这个变量所在的缓存行的数据写回到系统内存
            3. 在多处理器中,为了保证各个处理器的缓存一致性,每个处理器通过嗅探在总线上传播的数据来检查自己的缓存值是不是过期了,如果处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态,就相当于**写回时发现状态标识为0失效**,当这个处理器对数据进行修改操作时,会重新从系统内存中读取数据到CPU缓存中
    展开
    
     8
  • 林三杠
    2019-07-24
    涉及到数据一致性的问题,cpu层,单机多线程内存层,分布式系统多台机器层,处理办法都差不多,原理是相通的
    
     7
  • 许童童
    2019-07-24
    MSI 缓存一致性协议没有E这个状态,也就是没有独享的状态。
    如果块尚未被装入缓存(处于“I”状态),则在装入该块之前,必须先要保证该地址的数据不会在其他缓存的缓存块中处于“M”状态。如果另一个缓存中有处于“M”状态的块,则它必须将数据写回后备存储,并回到“S”状态。
    MESI 多了E状态(独享状态),如果当前写入的是E,则可直接写入,提高了性能。
    
     6
  • fcb的鱼
    2020-02-06
    老师好,问下:在多核cpu里边,某个cpu更新了数据,再去广播其他cpu。怎么保证其他cpu一定是操作成功的呢?

    作者回复: fcb的鱼同学,

    你好,这个是由“协议”来保证的。也就是其他CPU,在收到特定的广播消息,必须做什么样的特定操作。
    只要“协议”是正确的,其他CPU操作之后的特定结果就会一致。那么,这个协议就是我们这里的MESI协议,你可以对照着下面的状态流转图看一下。

    如果你问的是CPU在硬件层面,是否一个操作必定执行成功(好比你让程序算 1+1 = 2 是不是会算错),那这个是要在硬件的电路层面来保证的。在一个分层的软硬件体系下,这个不是MESI协议需要考虑的时间。

    
    
  • 山间竹
    2020-01-05
    既然有了MESI协议,是不是就不需要volatile的可见性语义了?当然不是,还有三个问题:

    并不是所有的硬件架构都提供了相同的一致性保证,JVM需要volatile统一语义(就算是MESI,也只解决CPU缓存层面的问题,没有涉及其他层面)。
    可见性问题不仅仅局限于CPU缓存内,JVM自己维护的内存模型中也有可见性问题。使用volatile做标记,可以解决JVM层面的可见性问题。
    如果不考虑真·重排序,MESI确实解决了CPU缓存层面的可见性问题;然而,真·重排序也会导致可见性问题。

    作者回复: 山间竹同学,

    是的,JVM本质上是个抽象的“计算机硬件”,所以volatile对于JVM维护语义是有意义的,

    
    
  • 劳码识途
    2020-01-02
    我了解mesif和moesi多一些,但是大体思想都是在进行源头cc流量的过滤,有一个问题我一直没有想明白,如果存在两个核心上两个s态的缓存行同时被进行了写操作,这时候会出现数据丢失吗?
    
    
  • Geek_103f3f
    2019-12-18
    比编译原理课程那老师讲的好多了
    
    
  • casper
    2019-11-27
    原文中这一段有一点疑问。
    【那么“独占”和“共享”这两个状态的差别在哪里呢?这个差别就在于,在独占状态下,对应的 Cache Line 只加载到了当前 CPU 核所拥有的 Cache 里。其他的 CPU 核,并没有加载对应的数据到自己的 Cache 里。这个时候,如果要向独占的 Cache Block 写入数据,我们可以自由地写入数据,而不需要告知其他 CPU 核。】
    如果CPU A是在独占状态下使用某数据X,这时CPA更新了CacheBlock中的数据X为X1,而并不用通知其他CPU核。并且,CPU A的CacheBlock此时是脏的,但是根据上一讲写回的原理,X1并没有写回内存。
    这时CPU B中的指令也要用到X的,CPU B势必会从内存读取到其Cache Block,而CPU B使用的值就是X,和 CPU A使用中X1不就不一致了吗?
    展开
    
    
  • 追风筝的人
    2019-11-18
    MESI 协议,是已修改、独占、共享以及已失效这四个缩写的合称。独占和共享状态,就好像我们在多线程应用开发里面的读写锁机制,确保了我们的缓存一致性。
    
    
  • 拯救地球好累
    2019-10-30
    请问下老师,总线嗅探的话,各CPU会在每个指令周期中安排一次嗅探吗?
    
    
  • 随心而至
    2019-10-22
    老师这种讲课方式,真赞。每节只讲少量知识点,后面的知识点将前面的知识点作为基础,并解决前面提出的疑问。
    
    
  • 随心而至
    2019-10-22
    我编译了volatile相关的代码,在Win10 64位下,将java代码转换成字节码,再转换成机器码,发现是由lock cmpxchg两个指令实现的。
    
    
  • 活的潇洒
    2019-08-21
    1、有人成功,有人普通,到底是什么原因导致的?

    我们想成功,我们个人的水平必须是足够高的

    2、那么我们的水平高来源于哪里?

    来源于我们获得的知识,生活中每一天工作、上班、路上、回家获取的信息

    day39 笔记:https://www.cnblogs.com/luoahong/p/11358997.html
    展开
    
    
  • 小美
    2019-08-15
    关于更新的数据什么时候写回内存的问题,看那个状态图,应该是总线发出读或者写请求的时候,这个数据就会写回,然后进去共享或者失效状态。
    
    
  • 靠人品去赢
    2019-07-30
    其实想知道,那种一个主板插两个CPU那种服务器主板,他是怎么搞得?L3缓存会打通吗,还是就是两台电脑共用一个主板而已。
    
    
  • 逍遥法外
    2019-07-25
    老师你好,关于MESI,有一个疑问:MESI协议是不是只能保证缓存的最终一致?不然为什么java会有volatile?
     2
    
  • W.jyao
    2019-07-25
    没明白,其他cpu收到写失效之后把自己的cache置位失效状态,然后还做其他什么处理吗?
     1
    
  • Ezra_Xu
    2019-07-25
    L1,2,3 cache,以及主存都是公用的一个虚拟地址空间吗?感觉可以把cache里的地址和主存地址串起来用,每次读写都是唯一的地址值,这样是不是就可以避免缓存失效?
     2
    
  • 一塌糊涂
    2019-07-24
    老师问个问题,锁总线,锁缓存中中的锁缓存的概念,锁缓存用了mesi协议,cpu还做其他的了吗?还是单纯只靠缓存一致性,来锁缓存,
    
    
我们在线,来聊聊吧