Linux内存屏障

首先这里有一篇文章介绍内存屏障的,写的挺好的,可以看看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。具体可以参看上面推荐的文章。

你可能感兴趣的:(linux,优化,cache,性能优化,编译器)