首先这里有一篇文章介绍内存屏障的,写的挺好的,可以看看http://hi.baidu.com/_kouu/blog/item/67069bb457ff8ad236d3ca15.html
linux内存屏障是用来解决指令乱序的问题。什么是指令的乱序呢?简单一点说就是本来代码里面是这么写的:
instruction a;
intstuction b;
结果在cpu上执行变成了:
instruction b;
instruction a;
导致指令乱序,有下面几种情况:
1. CPU指令优化,cpu的流水线可以同时执行多条指令
2. 编译器优化,编译器处于性能优化的考虑,可能会优化指令的先后顺序
3. 还有一个跟乱序有关的,就是smp机器上cache的同步,比如在cpua上面,进行了下面的操作:
a = 1;
mb();
b = 1;
然后cpub上面读取这2个变量,虽然a写在b前面,但是如果cpua上的cache上a,b值在同步到cpub上时,b的cache同步在a之前,那么对cpub来说,还是相当于执行了:
b=1;
a=1;
所以mb指令,在smp上还保证cache的同步是一致的
虽然上面3种情况会导致指令乱序,但是cpu和编译器都会保证显示的因果依赖的指令,是串行的,也就是说,类似于:
a++;
b = f(a);
这样的代码,是会保证a++一定在b=f(a)前执行的。
但是除此之外的隐式因果依赖,cpu和编译器就没办法保证了,必须程序自动去调用mb。具体可以参看上面推荐的文章。