Kernel wmb/mb宏的作用
内存屏障主要解决的问题是编译器的优化和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宏的作用相关推荐
- 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )
文章目录 I . JNIEXPORT 与 JNICALL 宏定义 II . JNIEXPORT 与 JNICALL 宏定义说明 ( Windows 平台 ) III . JNIEXPORT 与 JNI ...
- 空的宏定义作用及常见用法
空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...
- Linux字符设备驱动中container_of宏的作用
Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...
- 关于QT_BEGIN_NAMESPACE宏的作用
最近注意到QT_BEGIN_NAMESPACE宏,具体如下: #ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H#include <QWidget&g ...
- 关于Linux Kernel中的宏定义likely和unlikely
在Linux kernel的源代码中,经常能见到if(likely(x))或if(unlikely(x))之类的用法,其确切含义需要说明一下,以便更好的理解kernel的源代码. likely与unl ...
- 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数
文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...
- C++ DISALLOW_COPY_AND_ASSIGN宏的作用
有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义. 因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进 ...
- LINUX C编程中_REENTRANT宏的作用
在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享.在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变.类似的问题还存在于fputs之类的函数中,这些函 ...
- c语言宏替换作用,C语言中,宏替换的替换规则
简单来说:宏定义又称为宏代换.宏替换,简称"宏".是C提供的三种预处理功能的其中一种.复杂的请看下面,讲的很全. 下面的带参宏定义,多行宏定义,在Linux内核源码中很多.另外si ...
- Cocos2d-x中常用宏的作用
1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...
最新文章
- django源码解析一(请求处理流程)
- Exchange 服务器查看版本号
- bundle install 出现 #39;gem install mysql2 -v #39;0.3.15#39; succeeds before bunding #39;
- poj 1092 Farmland (Geometry)
- 由于权限引起的Tomcat中项目某些页面访问不了
- 调试U-Boot笔记(一)
- 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
- java学习(77):GUL下拉菜单框和滚动条
- linux 刷新率77,Ubuntu 7.04屏幕刷新率
- 关于中小学编程教育的一些看法
- 【2019-游记】中山纪念中学暑期游Day6
- VMware16.2.3+debian11.3.0下载安装
- 壁纸wallpaper透视壁纸王者荣耀透视壁纸mpkg
- dirac 是什么?
- 语音领域的自适应滤波
- JAVA中JButton常用设置
- 基于Matlab实现的可视密码图示法设计
- php判断运营商,PHP根据手机号判断运营商(详细介绍附代码)
- Ubuntu上使用Codeblocks遇到的一些问题及解决方法
- java项目如何部署服务器-----如何传输文件到阿里云服务器(三)