欢迎来到天天文库
浏览记录
ID:28119150
大小:594.50 KB
页数:17页
时间:2018-12-08
《聊聊原子变量、锁、内存屏障那点事(2).doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、聊聊原子变量、锁、内存屏障那点事(2) 接上一篇文章,问题背景描述的差不多了,下面该解决方案登场了。 编译器优化乱序和CPU执行乱序的问题可以分别使用优化屏障(OptimizationBarrier)和内存屏障(MemoryBarrier)这两个机制来解决: 优化屏障(OptimizationBarrier):避免编译器的重排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。这就保证了编译时期的优化不会影响到实际代码逻辑顺序。 IA-32/AMD64架构上,在Linu
2、x下常用的GCC编译器上,优化屏障定义为(linuxkernel,include/linux/compiler-gcc.h):12/*The“volatile”isduetogccbugs*/#definebarrier()__asm____volatile__(““::聊聊原子变量、锁、内存屏障那点事(2) 接上一篇文章,问题背景描述的差不多了,下面该解决方案登场了。 编译器优化乱序和CPU执行乱序的问题可以分别使用优化屏障(OptimizationBarrier)和内存屏障(Memory
3、Barrier)这两个机制来解决: 优化屏障(OptimizationBarrier):避免编译器的重排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。这就保证了编译时期的优化不会影响到实际代码逻辑顺序。 IA-32/AMD64架构上,在Linux下常用的GCC编译器上,优化屏障定义为(linuxkernel,include/linux/compiler-gcc.h):12/*The“volatile”isduetogccbugs*/#definebarrier()__
4、asm____volatile__(““:::”memory”) 优化屏障告知编译器: 1.内存信息已经修改,屏障后的寄存器的值必须从内存中重新获取 2.必须按照代码顺序产生汇编代码,不得越过屏障 C/C++的volatile关键字也能起到优化限制的作用,但是和Java中的volatile(Java5之后)不同,C/C++中的volatile不提供任何防止乱序的功能,也并不保证访存的原子性。 内存屏障(MemoryBarrier)分为写屏障(StoreBarrier)、读屏障(Load
5、Barrier)和全屏障(FullBarrier),其作用有两个: 防止指令之间的重排序 保证数据的可见性 关于第一点,关于指令重排,这里不考虑架构的话,Load和Store两种操作会有Load-Store、Store-Load、Load-Load、Store-Store这四种可能的乱序结果。上文提到的三种屏障则是限制这些不同乱序的机制。 关于第二点。写屏障会阻塞直到把StoreBuffer中的数据刷到Cache中;读屏障会阻塞直到InvalidQueue中的消息执行完毕。以此来保证核间
6、各级数据的一致性。 这里要强调,内存屏障解决的只是顺序一致性的问题,不解决Cache一致性的问题(这是Cache一致性协议的责任,也不需要程序员关注)。StoreBuffer和LoadBuffer等组件是属于流水线的一部分,和Cache无关。这里一定要区分清楚这两点,Cache一致性协议只是保证了Cache一致性(CacheCoherence),但是不关注顺序一致性(SequentialConsistency)的问题。比如,一个处理器对某变量A的写入操作仅比另一个处理器对A的读取操作提前很短的
7、一点时间,那就不一定能确保该读取操作会返回新写入的值。这个新写入的值多久之后能确保被读取操作读取到,这是内存一致性模型(MemoryConsistencyModels)要讨论的问题。 完全的确保顺序一致性需要很大的代价,不仅限制编译器的优化,也限制了CPU的执行效率。为了更好地挖掘硬件的并行能力,现代的CPU多半都是介于两者之间,即所谓的宽松的内存一致性模型(RelaxedMemoryConsistencyModels)。不同的架构在重排上有各自的尺度,在严格排序和自由排序之间会有各自的偏向。
8、偏向严格排序的一边,称之为强模型(StrongModel),而偏向于自由排序的一边,称之为弱模型(WeakModel)。AMD64架构是強模型: 特别地,早先时候,AMD64架构也会有Load-Load乱序发生(MemoryOrderinginModernMicroprocessors,PaulE.McKenney,2006)。 注意这里的IA-64(IntaniumProcessorFamily)是弱模型,它和Intel®64不是一回事。后者是从AMD交叉授权来的,源头就是AMD6
此文档下载收益归作者所有