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。具体可以参看上面推荐的文章。
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内核同步之每CPU变量、原子操作、内存屏障、自旋锁
- Linux 内核内存屏障
- linux内存屏障
- Linux 内存屏障
- LINUX内核之内存屏障
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
- linux-----内存屏障浅析
- linux内存屏障浅析
- Linux-内存屏障
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁
- Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁
- linux的内核之内存屏障
- Linux中内存屏障
- Linux下怎样查看机器配置,及cpu/内存/硬盘使用率
- Linux下计算进程的CPU占用和内存占用的编程方法[转]
- linux命令-- 手动释放linux内存
- linux下查看最消耗CPU、内存的进程
- Linux下的内存调试工具 ---valgrind
- Linux 释放内存方法
- linux中的高端低端内存以及逻辑虚拟地址