简介

现代处理器在执行指令时,使用多种技术,提高指令的执行效率,例如多级cache,流水线,多发射,乱序执行等。

这些技术的引入,导致对主存的访问顺序并不一定是编码时的顺序,也就是说,对主存的访问,是乱序的,代码中后一条指令对主存的访问可能发生在前一条指令对主存访问之前。

当程序的正确性依赖于对内存的访问顺序时,这样就会带来一系列问题。

当然对主存的乱序访问主要发生在两个阶段

1:在程序编译时,编译器对指令重排导致。

2:程序执行时,多cpu之间的交互导致的乱序访问。

大部分情况下,乱序访问并不一定带来问题,但在某些特定情况下,乱序访问导致程序与预期行为不符,因此现代处理器以及OS

提供了一些可以保证内存访问有序的指令和接口。

Cache

由于CPU访问外部主存至少在几十个CPU周期,因此CPU在内部设置了一系列的缓存空间,加速对主存数据的访问。这样就存在主存数据与CPU内Cache数据的一致性问题,CPU cache与主存之间的数据并不是实时同步,其中一个CPU对某个主存数据进行的修改,其他CPU也不一定能立即感知到。

现代CPU通过提供一些特殊的指令,可以在CPU修改完数据后,将Cache中的数据强制同步到主存,从而确保Cache与主存数据一致,也可以通过特殊指令强制CPU从主存读取数据刷新Cache中的数据。

流水线

现代CPU为了提高指令执行效率,将一条指令的执行步骤划分成多个阶段,然后按照流水线的方式进行执行,例如经典的五级流水线将

指令划分为“取指”“译码”“执行”“访存”“写回”,这样当执行一条指令的下一个过程时,下一条指令的上一个过程开始同步执行。

多发射

随着CPU技术的发展,人们不满足于一次只执行一条指令,从而发展出了一次执行多条指令的技术,类似于存在多条流水线,不同的流水线执行豪无关联的不同的指令。

乱序执行

对于一个程序中,先后并无关系的两条指令,现代CPU可以进行乱序执行,例如对主存中两个不同地址的读写操作,其执行顺序并不一定是代码中的先后顺序。

内存屏障指令

为了确保不同的CPU访问到的数据是一致的,通过一些特殊的CPU指令和接口确保代码前后位置的执行是有序完成的,这样的技术被称为内存屏障。

在Linux内核代码中,提供了以下一些接口完成内存屏障的功能(不同的CPU体系,使用了CPU特定指令)。

mb():适用于多处理器和单处理器的内存屏障。

rmb():适用于多处理器和单处理器的读内存屏障。

wmb():适用于多处理器和单处理器的写内存屏障。

smp_mb():适用于多处理器的内存屏障。

smp_rmb():适用于多处理器的读内存屏障。

smp_wmb():适用于多处理器的写内存屏障。

内存屏障linux,Linux内存屏障相关推荐

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

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

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

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

  3. 【Linux 内核 内存管理】优化内存屏障 ② ( 内存屏障 | 编译器屏障 | 处理器内存屏障 | 内存映射 I/O 写屏障 )

    文章目录 一.内存屏障 二.编译器屏障 三.处理器内存屏障 一.内存屏障 内存屏障 , 又称为 " 屏障指令 " , 用于保证 " 编译器 " 或 " ...

  4. [译] LINUX内核内存屏障

    ================= LINUX内核内存屏障 ================= By: David Howells <dhowells@redhat.com> Paul E ...

  5. LINUX内核内存屏障

    ================= LINUX内核内存屏障 ================= By: David Howells <dhowells@redhat.com> Paul E ...

  6. linux内核内存屏障,从硬件引申出内存屏障,带你深入了解Linux内核RCU

    本文简介 本文从硬件的角度引申出内存屏障,这不是内存屏障的详尽手册,但是相关知识对于理解RCU有所帮助.这不是一篇单独的文章,这是<谢宝友:深入理解Linux RCU>系列的第2篇,前序文 ...

  7. 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用

    文章目录 屏障是什么 Linux Kernel 中的屏障 Linux 屏障 API 一般的屏障 强制性屏障 SMP 条件屏障 隐式屏障 其他屏障 屏障的开销 未来的文章 本文翻译自 Memory ac ...

  8. 【Linux 内核 内存管理】优化内存屏障 ① ( barrier 优化屏障 | 编译器优化 | CPU 执行优化 | 优化屏障源码 barrier 宏 )

    文章目录 一.优化屏障 ( 编译器优化 | CPU 执行优化 ) 二.优化屏障源码 一.优化屏障 ( 编译器优化 | CPU 执行优化 ) " 代码 " 编译成 " 可执 ...

  9. 【Linux】内存屏障

    内存屏障的缘由 内存屏障的引入,本质上由于CPU重排指令引起的. 编译器编译时的优化: 处理器执行时的多发射和乱序优化: 读取存储指令的优化: 缓存同步顺序: **内存一致性模型(Memory Con ...

  10. 【Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )

    文章目录 一.RCU 机制适用场景 二.RCU 机制特点 三.使用 RCU 机制保护链表 一.RCU 机制适用场景 在上一篇博客 [Linux 内核 内存管理]RCU 机制 ① ( RCU 机制简介 ...

最新文章

  1. util.sh 脚本
  2. 嵌入式系统自动使能alias
  3. vscode怎么自动将px转换成vw_基于react/vue移动端适配之px自动转rem、vw
  4. 模块开发者使用 ES Modules 的正确姿势
  5. 安装centos linux7,安装centos7
  6. Permission denied (publickey) 解决方案
  7. 【图像去噪】基于matlab中值滤波图像去噪【含Matlab源码 421期】
  8. 群晖nas存储系统原理_群晖NAS 创建存储池和存储空间图文教程
  9. R Talk | 旷视南京研究院魏秀参:细粒度图像分析综述
  10. java 读取文件 效率_JAVA读写文本文件的效率
  11. Windows必备程序 | CleanMyPC安装教程
  12. 小白入门大数据行业需要了解什么?
  13. M32S 串口摄像头的技术应用
  14. 利用出生年月日求年龄
  15. mysql 1677_【MySQL】Error Code:1677处理过程小记
  16. 掌握PS制作,实时预览你的精彩作品
  17. C/C++编程规范整理
  18. c语言常用库函数使用要点,C语言常用库函数使用要点.doc
  19. Eclipse如何开发Android?
  20. 端口扫描程序 快速扫描 多线程、范围端口、范围IP、查看历史记录 Windows/MacOS

热门文章

  1. 在.NET客户端程序中使用多线程
  2. springboot使用maven打包无法打进本地包解决方法
  3. matplotlib安装错误依赖问题解决
  4. mybatis中传入String类型参数异常
  5. vs2017 2019 下载更新慢的解决方法
  6. 如何使flexbox子代的父母高度为100%?
  7. 如何在现有的ul中添加li?
  8. 基于表单的网站身份验证的权威指南[关闭]
  9. 厉害!重庆参加马拉松赛人数7年翻10倍,今年区县马拉松赛事将大增
  10. 使sqoop能够启用压缩的一些配置