阅读:3015回复:7
请教术语内存屏障,wmb()和rmb()(20分感谢)分数已给
在Linux下面对I/O进行操作,读和写的顺序都很重要,要在每个读写的操作之后都加上wmb()/rmb()吗?文档说编译器和CPU会对代码进行优化,然后造成对I/O操作的顺序和我们代码上的顺序不一致,这种自作聪明的优化可能会使我们得到非预期的结果。其间又提到了I/O操作有边缘效应,我看的这本书比较烂,对这些术语不做任何解释,而只是对一些简单的概念绕来绕去,Faint!!!各位大虾办忙啊,解释一下这些术语吧。怎么Linux和Windows对I/O操作会有这么大差异啊(按照文档上说的应该是由于编译器造成的,难道GCC和Windows下的VC的差别很大吗)。
[编辑 - 1/27/03 by silan] [编辑 - 2/11/03 by silan] |
|
|
沙发#
发布于:2003-01-22 21:32
摘自linux device driver 2nd edition:
#include <asm/system.h> \"void rmb(void);\" \"void wmb(void);\" \"void mb(void);\" 这些函数在已编译的指令流中插入硬件内存屏障;具体的插入方法是平台相关的。rmb (读内存屏障)保证了屏障之前的读操作一定会在后来的读操作执行之前完成。wmb 保证写操作不会乱序,mb 指令保证了两者都不会。这些函数都是 barrier 函数的超集。 解释一下:编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据 缓存,读写指令乱序执行等等。如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错误。但如果对I/O操作进行类似优化很可能造成致命错误。所以要使用内存屏障,以强制该语句前后的指令以正确的次序完成。 在关键的地方需要加上wmb()/rmb(),以保证读写顺序。 |
|
板凳#
发布于:2003-01-23 11:24
既然这种“优化”可能会产生错误,那是不是画蛇添足,甚至应该说是编译器自作聪明的bug?Window下的那些编译器好像就没有这种说法啊。能不能详细解释一下I/O操作的边际效应?对I/O操作的优化是不是也优化缓存到CPU寄存器/缓存?这不明摆着会有错误吗,为什么还要优化呢?谢谢
|
|
|
地板#
发布于:2003-01-24 10:29
X86下没有这个问题,这就是为什么萎软的文档没有这种说法的原因,因为windows只能跑x86。
|
|
|
地下室#
发布于:2003-01-27 09:15
我还是不明白,这么说能否优化还是和硬件平台相关的?或者说对I/O的乱序操作是由于CPU的自身优化处理造成的,还是说编译器根据CPU的类型优化编译时产生的?如果Linux和我的驱动都是跑在X86平台上,是不是就不需要加rmb(),wmb()这些东东?
|
|
|
5楼#
发布于:2003-01-31 00:37
当然是和cpu密切相关,尤其是cache部分!
不同的cpu处理不同的,x86就不存在这个问题。 |
|
|
6楼#
发布于:2003-02-14 10:37
这个问题涉及到cache和总线锁,一般用于smp
|
|
7楼#
发布于:2003-02-21 13:48
These two function expand to nothing on x86
|
|