重排

内存屏障

内存屏障种类

编译器和处理器必须同时遵守重排规则。多核处理器需使用内存屏障指令来确保一致性。即使编译器优化掉了一个字段访问(因为一个读入的值未被使用),需要产生内存屏障,就像这个访问仍然需要保护。(可参考下面的优化掉内存屏障的章节)。

内存屏障指令仅直接控制CPU与其缓存之间,与垃圾回收机制中“写屏障(write barriers)”无关。

一、重排序

编译器或者CPU的代码的结构重排排序,达到最佳效果。

(1)编译器重排

CPU只读一次的x和y值。不需反复读取寄存器交替x和y值

(2)处理器重排

写缓存区没有及时刷新,使得处理器执行的读写操作与内存上顺序不一致

处理器A读b=0,处理器B读a=0。A1写a=1先写到处理器A的写缓存区中,此时内存中a=0。如果这时处理器B从内存中读a,读到的将是0。

可能会出现x,y都是0。

二、内存屏障

为了解决上述问题,处理器提供内存屏障指令(Memory Barrier):

写内存屏障(Store Memory Barrier):处理器将存储缓存值写回主存(阻塞方式)。

读内存屏障(Load Memory Barrier):处理器,处理失效队列(阻塞方式)。

保证两个操作之间数据的可见性。

volatile读前插读屏障,写后加写屏障,避免CPU重排导致的问题,实现多线程之间数据的可见性

三、内存屏障的种类

StoreLoad开销最大。万能屏障,兼具其它三种内存屏障功能。执行时,处理器通常要把写缓冲区中的数据全部刷新的内存中

对于处理器来说,内存屏障会导致cpu缓存的刷新,刷新时,会遵循缓存一致性协议。

lock解锁时,jvm会强制刷新cpu缓存,导致当前线程更改,对其他线程可见。

volatile:标记volatile的字段,在操作时,会强制刷新cpu缓存,标记volatile的字段,每次读取都是直接读内存

final:即时编译器在final写操作后,会插入内存屏障,来禁止重排序,保证可见性

作者:hedgehog1112
链接:https://www.jianshu.com/p/08a0a8c984ab
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

让你了解什么是内存屏障相关推荐

  1. C++ 从双重检查锁定问题 到 内存屏障的一些思考

    文章目录 1. 问题描述 2. DCLP 的问题 和 指令执行顺序 2.1 Volatile 关键字 2.2 C++11 的内存模型 3. C++11内存模型 解决DCLP问题 3.1 内存屏障和获得 ...

  2. 远看像乱序执行,近看是内存屏障的 BUG 是如何解决的?

    作者 | 马超 出品 | CSDN博客 前几天我发布了<几种主流语言的高并发实现的比较,Serverless时代Rust即将迎来春天>后,针对热心读者的回复针对他所提出的问题我又总结了一篇 ...

  3. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  4. # 内存屏障:骇客的硬件视角(1)

    翻译自内存屏障 那么到底是什么让CPU的设计大师们着了魔,要把内存屏障这个鬼东西强行塞给了毫不知情的多处理器系统的软件开发者? 简单点说,就是因为内存访问顺序的重排会带来更好的性能.同步原语的正确操作 ...

  5. 内存屏障linux,Linux内存屏障

    简介 现代处理器在执行指令时,使用多种技术,提高指令的执行效率,例如多级cache,流水线,多发射,乱序执行等. 这些技术的引入,导致对主存的访问顺序并不一定是编码时的顺序,也就是说,对主存的访问,是 ...

  6. linux内存屏障浅析

    内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题. 为什么会乱序 现在的CPU一般采用流水线来执行指令.一个指令的执行被分成:取指.译码.访存.执行.写回.等若干个阶段.然后 ...

  7. volatile和内存屏障(dmb)

    volatile C语言中 volatile 关键字用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化.volatile只能保证编译器不会做乱序执行优化. 1. 不对*p操作生成乱序指令(通常 ...

  8. 《为什么在多核处理器下需要内存屏障(MenmoryBarrier)?》

    <为什么在多核处理器下需要内存屏障(MenmoryBarrier)?> 因为CPU的乱序执行技术虽然可以极大的提高流水线的工作效率,但是导致了实际运行次序和program的次序不一致,如果 ...

  9. 【Linux 内核 内存管理】优化内存屏障 ④ ( 处理器内存屏障 | 八种处理器内存屏障 | 通用内存屏障 | 写内存屏障 | 读内存屏障 | 数据依赖屏障 | 强制性内存屏障 |SMP内存屏障 )

    文章目录 一.处理器内存屏障 二.Linux 内核处理器内存屏障 一.处理器内存屏障 " 处理器内存屏障 " 针对 " CPU " 之间的内存访问乱序 和 CP ...

  10. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

    文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...

最新文章

  1. js事件详解二:鼠标和滚轮事件
  2. css 解决fixed 布局下不能滚动的问题
  3. (五)WebRTC手记Channel概念
  4. 翻译Raywenderlich 最新文章What’s New in Swift 4
  5. 云计算--Presto
  6. python staticmothed classmethod
  7. 探索ArrayList自动改变size真相
  8. gzip(来源百度百科)
  9. error2---BeginPath和EndPath之间的TextOut无法显示
  10. 使用flask调用接口去加载模型和数据集,避免每次运行都会重复加载数据集或模型,节约大量等待时间
  11. 想学java编程从哪入手_初学编程从哪方面入手?
  12. 洛谷P2886牛继电器
  13. 自动化测试基础篇--Selenium弹出框alert
  14. 形如1/(a+bsinx)的积分公式的证明
  15. [软件笔试] 2014暴风影音校招技术笔试题(长春站)
  16. 给众多IT行业开发者的一个建议,要注意避开黑心的培训机构
  17. 以太网网卡历史-3com,intel及其它
  18. RDD、DataFrame、DataSet原理解析
  19. win10亮度进度条不见了
  20. 大话设计模式系列目录

热门文章

  1. easyexcel中的常用注解
  2. python多线程网络编程_python网络编程之线程
  3. oracle 64位客户端_LabVIEW读取Oracle数据库-开题
  4. 安卓电视版linux,MythTV 30.0 发布,前端支持选择Android电视设备
  5. python tableview绑定字典_TableView索引的添加
  6. java m4a文件拼接_面试官:为啥不提倡字符串拼接?看阿里java开发手册怎么说
  7. python中如何定义一个数组_Python数组定义方法
  8. __slots__的作用
  9. lr与svm如何选择-面试
  10. finereport 登录界面的代码文件_【干货下载】多彩包含网页登录界面等4款WEB模板素材作品集源文件...