zoukankan      html  css  js  c++  java
  • 伪共享与volatile

    一、volatile

    为了解决缓存不一致性问题,通常来说有以下2种解决方法:

      1)通过在总线加LOCK#锁的方式(通过在总线上加LOCK#锁的形式来解决缓存不一致的问题)

      2)通过缓存一致性协议(最出名的就是Intel 的MESI协)

    这两种方法都是硬件层面的,在语言层面利用volatile以及加锁方式来保证 

            volatile的机制是保证可见性与禁止指令从排序,以就是当不同线程的不同缓存行存在内存中同一个变量的拷贝时,当一个缓存行中改值变量值改变时,用volatile修饰会使得改值立刻刷新到主存,从而第二个缓存行中该值失效,会再次从主存读取该值(类似于硬件层面的缓存一致性协议MESI)

    二、伪共享

            伪共享是同一缓存行中两个变量问题(也就是多线程中的共享变量(比如disruptor中计数的线标atomic类就是封装成64字节来解决)),一个更新会导致另一个变量失效,从主存加载数据,导致速度很慢。

           如下图:如果一个 CPU 核心的线程在对 a 进行修改,另一个 CPU 核心的线程却在对 b 进行读取。

                        当前者修改 a 时,会把 a 和 b 同时加载到前者核心的缓存行中,更新完 a 后其它所有包含 a 的缓存行都将失效,因为其它缓存中的 a 不是最新值了。

                        而当后者读取 b 时,发现这个缓存行已经失效了,需要从主内存中重新加载。

                       请记住,我们的缓存都是以缓存行作为一个单位来处理的,所以失效 a 的缓存的同时,也会把 b 失效,反之亦然。

    参考:https://www.jianshu.com/p/7758bb277985

              https://www.cnblogs.com/dolphin0520/p/3920373.html      写得超级好

  • 相关阅读:
    xshell,putty远程连接Linux并使用密钥认证
    配置IP
    认识linux
    dpkg: error processing package libraspberrypi-doc (--configure): package is in a very bad inconsistent state;
    pi4j,Netbeans中togglebutton跟Jbutton的区别
    Netbeans配置Java SE嵌入式平台(树莓派)
    发光二极管正负极判断
    Eclipse安装图形JFrame,Jswing编程界面
    阿里云Centos6.9安装图形化界面
    Oracle 一个中文汉字 占用几个字节,由Oracle中字符集编码决定
  • 原文地址:https://www.cnblogs.com/yangcao/p/11706909.html
Copyright © 2011-2022 走看看