聊聊原子变量、锁、内存屏障那点事(2).doc

聊聊原子变量、锁、内存屏障那点事(2).doc

ID:28119150

大小:594.50 KB

页数:17页

时间:2018-12-08

聊聊原子变量、锁、内存屏障那点事(2).doc_第1页
聊聊原子变量、锁、内存屏障那点事(2).doc_第2页
聊聊原子变量、锁、内存屏障那点事(2).doc_第3页
聊聊原子变量、锁、内存屏障那点事(2).doc_第4页
聊聊原子变量、锁、内存屏障那点事(2).doc_第5页
资源描述:

《聊聊原子变量、锁、内存屏障那点事(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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。