Linux中解决存储访问一致性问题的方法
来源:互联网 发布:淘宝tommy代购是假货吗 编辑:程序博客网 时间:2024/05/20 23:58
摘自:http://www.hongxiangbiao.com/inc_books.asp?NewsID=520&classID=17
在Linux中,是用barrier()宏来解决以上存储访问一致性问题的,barrier()的定义如下所示:
#define barrier() __asm__ __volatile__("": : :"memory")
另外在barrier()的基础上还衍生出了很多类似的定义,如:
#define mb() __asm__ __volatile__ ("" : : : "memory")
#define rmb() mb()
#define wmb() mb()
#define smp_mb() barrier()
#define smp_rmb() barrier()
#define smp_wmb() barrier()
barrier是内存屏障的意思,CPU越过内存屏障后,将刷新自己对存储器的缓冲状态。barrier()宏定义这条语句实际上不生成任何代码,但可使gcc在barrier()之后刷新寄存器对变量的分配。具体分析如下。
指 令
说 明
__asm__
告诉编译器下面为汇编语句
__volatile__
告诉编译器该对象可能在程序之外被修改,严禁将此处的汇编语句与其他的语句重组合优化,即按原来的样子处理这这里的汇编。在C语言中通过使用关键字“volatile”声明存储器映射的I/O空间来防止编译器在优化时删掉有用的存储访问操作
Memory
告诉gcc 编译器所有内存单元均被汇编指令修改过,registers和cache中已缓存的内存单元中的数据将作废,barrier之后的程序CPU必须重新从内存中读取数据而不是使用过期的registers和cache中的数据
"":::
表示这是个空指令。barrier()不用在此插入一条串行化汇编指令,所谓串行化指令也就是同步指令,即将cache、Write Buffer和内存中的数据同步更新
概括起来说barrier()起到两个作用:
1)告诉编译器不要优化这部分代码,保持原有的指令执行顺序;
2)告诉CPU执行完barrier()之后要进行同步操作,更新registers、cache、写缓存和内存中的内容,全部重新从内存中取数据。
- Linux中解决存储访问一致性问题的方法
- 解决virtualbox中ssh访问的问题
- 如何解决Nginx的session一致性问题
- 在存储过程中使用事务处理 sql server 删除多表操作一致性的问题
- 使用VC在ADO中访问存储过程的方法
- 解决linux局域网访问MYSQL慢的问题
- 解决Visual SVN在linux下不能访问的问题
- 解决Linux外网部署tomcat访问不了的问题
- Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现
- Java解决在浏览器地址栏中输入url访问action的问题以及拦截方法过滤的简易实现
- 解决局域网中网络邻居访问响应“慢”的问题
- 解决ASP.NET 中目录访问权限的问题
- 解决ASP.NET中目录访问权限的问题
- 解决ASP.NET中目录访问权限的问题
- 如何解决DotNET中跨线程访问控件的问题
- 解决myeclipse中项目重命名后访问不到的问题
- LAN中A计算机访问B计算机中的VMware上的linux FC的问题?如何解决?
- sql server存储过程中解决单引号的问题
- iTunes 同步 应用程序 灰色
- 珠海市小学生入学条件
- socket
- poj_2184
- Php 加载PDF
- Linux中解决存储访问一致性问题的方法
- NFC Tag Types
- MyClass.alloc().init(foo.bar()).autorelease();
- shell脚本实现ipa一键安装(itms-services协议)
- 10g rac 备份 RMAN
- 用Ant实现Java项目的自动构建和部署
- Java 自动转换为Unicode文件
- PopupWindow 点击后如何消失
- linux时间管理 之 jiffies