内存屏障的缘由

内存屏障的引入,本质上由于CPU重排指令引起的。

  1. 编译器编译时的优化;
  2. 处理器执行时的多发射和乱序优化;
  3. 读取存储指令的优化;
  4. 缓存同步顺序;

**内存一致性模型(Memory Consistency Model)**是用来描述多线程对共享存储器的访问行为,在不同的内存一致性模型里,多线程对共享存储器的访问行为有非常大的差别。这些差别会严重影响程序的执行逻辑,甚至会造成软件逻辑问题。

不同的处理器架构,使用了不同的内存一致性模型,目前有多种内存一致性模型,从上到下模型的限制由强到弱:

顺序一致性(Sequential Consistency)模型
完全存储定序(Total Store Order)模型
部分存储定序(Part Store Order)模型
宽松存储(Relax Memory Order)模型
注意,这里说的内存模型是针对可以同时执行多线程的平台,如果只能同时执行一个线程,也就是系统中一共只有一个CPU核,那么它一定是满足顺序一致性模型的。

对于内存的访问,我们只关心两种类型的指令的顺序,一种是读取,一种是写入。对于读取和加载指令来说,它们两两一起,一共有四种组合:

LoadLoad:前一条指令是读取,后一条指令也是读取。
LoadStore:前一条指令是读取,后一条指令是写入。
StoreLoad:前一条指令是写入,后一条指令是读取。
StoreStore:前一条指令是写入,后一条指令也是写入。

写内存屏障
一个写内存屏障可以提供这样的保证,站在系统中的其它组件的角度来看,在屏障之前的写操作看起来将在屏障后的写操作之前发生。

如果映射到上面的例子来说,首先,写内存屏障会对处理器指令重排序做出一些限制,也就是在写内存屏障之前的写入指令一定不会被重排序到写内存屏障之后的写入指令之后。其次,在执行写内存屏障之后的写入指令之前,一定要保证清空当前CPU存储缓冲中的所有写操作,将它们全部“提交”到缓存中。这样的话系统中的其它组件(包括别的CPU),就可以保证在看到写内存屏障之后的写入数据之前先看到写内存屏障之前的写入数据。

写内存屏障仅仅限制了CPU对写操作的排序,对加载操作没有任何效果,对其它的指令也没有作用。而且,写内存屏障只是保证在写内存屏障之后的写入操作一定是在写内存屏障之前的写入操作之后被系统其它组件感知,它并不能保证在写内存屏障之前的所有写入操作的顺序,也不能保证在写内存屏障之后的所有写入操作的顺序。

写内存屏障只管自己CPU上的写入操作能够按照一定次序被系统中其它部件感知,但是如果其它部件有缓存将旧数据缓存下来了,这它管不着。这个是下面介绍的读内存屏障要管的事,因此一般写内存屏障要和读内存屏障配对使用。

读内存屏障
读内存屏障可以提供这样的保证,站在系统中其它组件的角度来看,所有在读内存屏障之前的加载操作将在读内存屏障之后的加载操作之前发生。

还是用上面的例子来说明,首先,读内存屏障也会对处理器指令重排做出一些限制,也就是在读内存屏障之前的读取指令一定不会被重排序到读内存屏障之后的读取指令之后。其次,在执行读内存屏障之后的读取指令之前,一定要保证处理完当前CPU的无效队列。这样的话,当前CPU的缓存状态将完全遵照MESI协议,可以保证缓存数据一致性。

通用内存屏障(读写内存屏障)
一个通用内存屏障可以提供这样的保证,站在系统中其它组件的角度来看,通用内存屏障之前的加载、存储操作都将在通用内存屏障之后的加载、存储操作之前发生。

还是用上面的例子来说明,首先,通用内存屏障也会对处理器指令重排做出一些限制,也就是在通用内存屏障之前的写入和读取指令一定不会被重排序到通用内存屏障之后的写入和读取指令之后。其次,在执行通用内存屏障之后的任何写入和读取取指令之前,一定要保证清空当前CPU存储缓冲中的所有写操作,并且还要处理完当前CPU的无效队列。

通用内存屏障等同于同时包含了读和写内存屏障的功能,因此也可以替换它们中的任何一个,只不过可能会一定程度上影响性能。

通用内存屏障同时限制了CPU对加载操作和存储操作的排序,但是对其它指令没有任何作用。而且,通用内存屏障只是保证在通用内存屏障之后的所有写入和读取操作一定是在通用内存屏障之前的写入和读取操作之后才执行,它并不能保证通用内存屏障之前的所有读取和写入操作的顺序,也不能保证通用内存屏障之后的所有读取和写入操作的顺序。

一般写内存屏障、读内存屏障和通用内存屏障都会默认包含编译屏障。

【Linux】内存屏障相关推荐

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

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

  2. 搞懂Linux内存屏障(值得收藏)

    1.编译器 编译器将符合人类思考的逻辑(c代码)翻译成了符合CPU运算规则的汇编指令,编译器了解底层CPU的思维模式,因此,它可以在将c翻译成汇编的时候进行优化(例如内存访问指令的重新排序),让产出的 ...

  3. linux 内存屏障,理解内存屏障(一)

    作者:新浪微博() 计算机学习微信公众号(jsj_xx) 1 前言 内存屏障是搞软件的需要面对的一个涉及硬件cpu的问题,很多人困惑不解.本文是我们对linux内核内存屏障的理解,参考linux内核( ...

  4. linux 内存屏障

    目录 前言 基础概念 内存乱序访问 定义 作用 过程 影响 编译时内存乱序访问 解决方法 运行时内存乱序访问 有序处理器(In-order processors) 乱序处理器(Out-of-order ...

  5. linux内存屏障浅析

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

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

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

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

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

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

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

  9. Linux并发与同步专题 (1)原子操作和内存屏障

    关键词:. <Linux并发与同步专题 (1)原子操作和内存屏障> <Linux并发与同步专题 (2)spinlock> <Linux并发与同步专题 (3) 信号量> ...

  10. LINUX内核之内存屏障

    LINUX内核之内存屏障 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univers ...

最新文章

  1. activity切换效果
  2. 多看看 leetcode 128. 最长连续序列
  3. linux 压缩和解压缩(zip/unzip)
  4. CVPR 2019 | 实体零售场景下密集商品的精确探测
  5. 电气论文:基于粒子群算法的梯级水火电力系统优化调度【有代码】
  6. C++文件操作之get/getline(待学)
  7. 通过JavaScript操作HTML中select标签
  8. spring 第一天:1015
  9. curl命令及其API 的使用
  10. 谈谈对java的理解
  11. 搭建情感分析系统,tf-idf,word2vec
  12. 解决[Vue warn]: Unknown custom element: <ag> - did you register the component correctly? For recursive
  13. 第四次机考(2019) C. f1二
  14. “无法访问此网站”的一些原因
  15. vpp之浅谈插件和使用
  16. 编程就是python吗_编程python是什么
  17. 第7周项目5 排队看病模拟
  18. C++到底还能做什么? ----感觉说的还是很有道理的,共勉!
  19. 深圳二手房房价分析与建模预测(附数据集)
  20. UART的RTS和CTS

热门文章

  1. popstate求解决方案~
  2. 计算机更新配置卡住了,Windows系统更新时电脑卡住或崩溃怎么办-万兴恢复专家...
  3. Codeforces 715A Plus and Square Root
  4. MATLAB中未定义函数或变量”的问题
  5. IOS开发基础 · SwiftUI · StanfordCS193p Lecture1-2
  6. 考试系统之选择题评分
  7. Excel规划求解Solver:三种方法的区别
  8. python取元素_python 如何提取对象内的元素
  9. tof摄像头手势识别_揭秘国内独家TOF深度摄像头,助力机器人避障与室内导航
  10. 【阿尼亚不会CTF】第六届”蓝帽杯“全国大学生网络安全技能大赛—线上初赛部分writeup