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      写得超级好

  • 相关阅读:
    小程序 canvas实现图片预览,图片保存
    MySQL实现排名并查询指定用户排名功能
    微信小程序canvas把正方形图片绘制成圆形
    WINDOW 安装ImageMagick服务端和PHP的imagick插件
    安装PHP扩展32位与64位的误区(x86与x64的查看)
    linux 安装 ImageMagick 和 imagick 扩展
    php 获取顶级域名
    php中通过Hashids将整数转化为唯一字符串
    yii2项目中运行composer 过程中遇到的问题
    yii2 mysql根据多个字段的数据计算排序
  • 原文地址:https://www.cnblogs.com/yangcao/p/11706909.html
Copyright © 2011-2022 走看看