前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编译器内存屏障

编译器内存屏障

作者头像
用户4700054
发布2022-08-17 12:32:52
4810
发布2022-08-17 12:32:52
举报
文章被收录于专栏:存储内核技术交流

内存屏障介绍

  • 内存屏障(memory barrier)是一种保证内存顺序访问的方法,用来解决下面这些内存乱序访问的问题。出现内存乱序访问一般有3个方面的因素
    • 编译器编译代码时候可能会重新排列汇编指令,使编译出来的程序在处理器上更快,但是有时候优化的结果可能不符合程序设计者的意图。
    • 现代处理器采用标量体系结构和乱序执行 技术,能够在一个时钟周期内并发执行多条指令,处理器按照指令顺序取出,分析出没有依赖关系的指令然后发给多个处理器执行,最后按照顺序提交执行结果。用一句话总结就是顺序取出,乱序执行,顺序提交结果执行。在有些情况下,处理器无法识别指令之间的关系,这时就会导致指乱序执行导致执行结果不符合预期
    • 多CPU处理器系统中,有些程序设计者会使用存储缓冲区,引入处理器之间的内存访问乱系的问题,一个处理器修改了数据,可能不会立即同步到自己的缓存或者其他处理器缓存,到时其他处理器不能立即看到最新的数据。
  • 内核目前支持三种内存屏障,编译器屏障处理器内存屏障内存映射IO写屏障。这里着重介绍编译器屏障
编译器屏障
  • 为提高程序代码的执行效率,编译器对代码进行优化,对于不存在依赖关系的汇编指令,重新排列他们的顺序,但是编译器优化的结果不符合预期,开发者需要去控制或者阻止这种编译器优化。barrier()是编译器提供的屏障的函数,这个函数会阻止编译器把屏障一侧的指令移动到另一侧,既不把屏障前面的指令移动到屏障后面,也不能把屏障后面的指令移动到屏障前面,编译器屏障也叫做编译器优化屏障。内核定义了宏READ_ONCE()、WRITE_ONCE()和ACCESS_ONCE()可以看做barrier()弱化形式,只阻止编译器对于单个变量优化,C语言提供了关键字volatile可以防止编译器优化单个变量。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内存屏障介绍
    • 编译器屏障
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档