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()宏定义这条语句实际上不生成任何代码,但可使gccbarrier()之后刷新寄存器对变量的分配。具体分析如下。

    

    

__asm__

告诉编译器下面为汇编语句

__volatile__

告诉编译器该对象可能在程序之外被修改,严禁将此处的汇编语句与其他的语句重组合优化,即按原来的样子处理这这里的汇编。在C语言中通过使用关键字“volatile”声明存储器映射的I/O空间来防止编译器在优化时删掉有用的存储访问操作

Memory

告诉gcc 编译器所有内存单元均被汇编指令修改过,registerscache中已缓存的内存单元中的数据将作废,barrier之后的程序CPU必须重新从内存中读取数据而不是使用过期的registerscache中的数据

"":::

表示这是个空指令。barrier()不用在此插入一条串行化汇编指令,所谓串行化指令也就是同步指令,即将cacheWrite Buffer和内存中的数据同步更新

概括起来说barrier()起到两个作用:

1)告诉编译器不要优化这部分代码,保持原有的指令执行顺序;

2)告诉CPU执行完barrier()之后要进行同步操作,更新registerscache、写缓存和内存中的内容,全部重新从内存中取数据。

原创粉丝点击