内存屏障主要解决的问题是编译器的优化和CPU的乱序执行。
编译器在优化的时候,生成的汇编指令可能和c语言程序的执行顺序不一样,在需要程序严格按照c语言顺序执行时,需要显式的告诉编译不需要优化,这在linux下是通过barrier()宏完成的,它依靠volidate关键字和memory关键字,前者告诉编译barrier()周围的指令不要被优化,后者作用是告诉编译器汇编代码会使内存里面的值更改,编译器应使用内存里的新值而非寄存器里保存的老值。
同样,CPU执行会通过乱序以提高性能。汇编里的指令不一定是按照我们看到的顺序执行的。linux中通过mb()系列宏来保证执行的顺序。具体做法是通过mfence/lfence指令(它们是奔4后引进的,早期x86没有)以及x86指令中带有串行特性的指令(这样的指令很多,例如linux中实现时用到的lock指令,I/O指令,操作控制寄存器、系统寄存器、调试寄存器的指令、iret指令等等)。简单的说,如果在程序某处插入了mb()/rmb()/wmb()宏,则宏之前的程序保证比宏之后的程序先执行,从而实现串行化。wmb的实现和barrier()类似,是因为在x86平台上,写内存的操作不会被乱序执行。
实际上在RSIC平台上,这些串行工作都有专门的指令由程序员显式的完成,比如在需要的地方调用串行指令,而不像x86上有这么多隐性的带有串行特性指令(例如lock指令)。所以在risc平台下工作的朋友通常对串行化操作理解的容易些。

转载于:https://www.cnblogs.com/super119/archive/2012/11/28/2793039.html

Kernel wmb/mb宏的作用相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )

    文章目录 I . JNIEXPORT 与 JNICALL 宏定义 II . JNIEXPORT 与 JNICALL 宏定义说明 ( Windows 平台 ) III . JNIEXPORT 与 JNI ...

  2. 空的宏定义作用及常见用法

    空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...

  3. Linux字符设备驱动中container_of宏的作用

    Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...

  4. 关于QT_BEGIN_NAMESPACE宏的作用

    最近注意到QT_BEGIN_NAMESPACE宏,具体如下: #ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H#include <QWidget&g ...

  5. 关于Linux Kernel中的宏定义likely和unlikely

    在Linux kernel的源代码中,经常能见到if(likely(x))或if(unlikely(x))之类的用法,其确切含义需要说明一下,以便更好的理解kernel的源代码. likely与unl ...

  6. 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数

    文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...

  7. C++ DISALLOW_COPY_AND_ASSIGN宏的作用

    有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义. 因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进 ...

  8. LINUX C编程中_REENTRANT宏的作用

    在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享.在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变.类似的问题还存在于fputs之类的函数中,这些函 ...

  9. c语言宏替换作用,C语言中,宏替换的替换规则

    简单来说:宏定义又称为宏代换.宏替换,简称"宏".是C提供的三种预处理功能的其中一种.复杂的请看下面,讲的很全. 下面的带参宏定义,多行宏定义,在Linux内核源码中很多.另外si ...

  10. Cocos2d-x中常用宏的作用

    1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...

最新文章

  1. django源码解析一(请求处理流程)
  2. Exchange 服务器查看版本号
  3. bundle install 出现 #39;gem install mysql2 -v #39;0.3.15#39; succeeds before bunding #39;
  4. poj 1092 Farmland (Geometry)
  5. 由于权限引起的Tomcat中项目某些页面访问不了
  6. 调试U-Boot笔记(一)
  7. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
  8. java学习(77):GUL下拉菜单框和滚动条
  9. linux 刷新率77,Ubuntu 7.04屏幕刷新率
  10. 关于中小学编程教育的一些看法
  11. 【2019-游记】中山纪念中学暑期游Day6
  12. VMware16.2.3+debian11.3.0下载安装
  13. 壁纸wallpaper透视壁纸王者荣耀透视壁纸mpkg
  14. dirac 是什么?
  15. 语音领域的自适应滤波
  16. JAVA中JButton常用设置
  17. 基于Matlab实现的可视密码图示法设计
  18. php判断运营商,PHP根据手机号判断运营商(详细介绍附代码)
  19. Ubuntu上使用Codeblocks遇到的一些问题及解决方法
  20. java项目如何部署服务器-----如何传输文件到阿里云服务器(三)

热门文章

  1. 如何搜索网易云中的评论
  2. docker安装常用命令docker网络
  3. java中美元符号的作用_$美元符号在配置文件中的意义
  4. ENVI实现带DN值保存为TIFF格式
  5. 数独大师级技巧_数独游戏技巧(图解)
  6. 游戏引擎 Unity 的入门易精通难体现在哪?为什么?
  7. 阿里云携手开源中国众包平台发布百万悬赏项目
  8. VMware没有未桥接的主机网络适配器,VMware bridge protocol服务卸载不掉
  9. GPS测量定位的类型
  10. 递归的本质(栈:后进先出)