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

  • 相关阅读:
    【Boost】boost库asio详解5——resolver与endpoint使用说明
    VS路径定义
    C++ Primer 第二章 学习笔记
    C++ Primer 第三章 学习笔记
    C++ dll的隐式与显式调用
    BOOST编译方法
    Real World CTF一日游
    蝉知CMS5.6反射型XSS审计复现
    关于MJ刷新的报Too many arguments to function call, expected 0, have *问题
    XIB做适配(二)
  • 原文地址:https://www.cnblogs.com/yangcao/p/11706909.html
Copyright © 2011-2022 走看看