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。具体可以参看上面推荐的文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值