首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

关于内存储器屏障

2013-01-11 
关于内存屏障请教高手们,linux中有内存屏障机制,barrier() ,mb(),等,小弟有一事不明,按照内存屏障的设计理

关于内存屏障
  请教高手们,linux中有内存屏障机制,barrier() ,mb(),等,小弟有一事不明,按照内存屏障的设计理念,是为了防止CPU乱序执行或者由于编译优化而导致有些命令执行顺序与希望的不一致,小弟的疑问是,需要内存屏障的代码的前后应该都属于同一个进程,而一个进程肯定只能运行在一个CPU上,可CPU在执行进程时又是顺序进行的,那本来就是顺序进行的,为什么还要有内存屏障的介入?难道说进程在被编译成可执行的一条一条命令时,是这些命令的顺序会被改变?
[解决办法]

引用:
一个进程肯定只能运行在一个CPU上,可CPU在执行进程时又是顺序进行的

这个说法是错误的。
一个进程会有很多线程,可以并行运行的。
即使一个线程,顺序存放的命令序列也不一定是顺序执行的。
[解决办法]
内存屏蔽应该只对具有乱序执行能力的cpu有用,以前的cpu很少有乱序能力,所以内存屏蔽不起作用,记得x86就不是乱序执行的
[解决办法]
内存屏障的用途好像是跟内存一致性有关,这里针对的乱序是内存操作指令出现在总线上的顺序,因为cache和R/W FIFO的存在,可能导致一个函数的运行结果跟你所想并不一致。更大的问题是当你进行热补丁操作的时候,icache在修改完代码区的瞬间可能是不正确的,这就是致命问题了。
感觉楼主所说内存屏障的定义不是很准确,至少在RISC上不是这样的,x86还真不知道怎么回事。
[解决办法]
是这样的,内存屏障又分为指令同步和数据同步。
执行指令的时候,如果处理器支持OOO乱序(out of order),那么哪怕你线程指令是有序的,执行的时候cpu会把非依赖指令打乱次序,以便达到更高的流水线效率。但是有些时候,需要等所有指令都执行完了,再往下做别的事情,那就需要指令同步。
数据同步也是一个道理。

热点排行