您的位置:首页 > 运维架构 > Linux

Linux内存屏障

2012-07-23 17:21 337 查看
首先这里有一篇文章介绍内存屏障的,写的挺好的,可以看看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。具体可以参看上面推荐的文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: