Why Memory Barrier
此文是对阅读文章《Memory Barriers: a Hardware View for Software Hackers》的总结。
另外请参考:Wikipake
<<计算机体系结构量化研究>>
在多线程编程中,为什么需要使用Memory Barriers?
1. 在多处理器硬件上, Cache一致性和松散的连贯性导致致内存新值被CPU感知到的顺序被重排了。
一致性: 保证所有的CPU都能够看到内存数据的变更
连贯性:描述一个内存值被某个CPU修改后,其它CPU要经过多久才能感知到新值; 不同的策略导致内存数据引用(提交和感知)的顺序性不同。
2. CPU的out-of-order execution特性导致指令的执行顺序被重排了
3. 编译器优化导致程序中的语句执行顺序被重排了
因为Memory Barrier由上述三种原因导致, 所以在指令中插入的Memory barrier(cpu指令和编译器指示符)需要消除上述的三个因素。
其中因素2,3很好理解, 而因素1就需要好好了解SMP平台上的Cache一致性原理和工作方式了(Memory Barriers: a hardware view for software hackers中重点解释了SMP上的Cache工作方式)。
记住如下图:
在这种模式下,可以认为: a "read memory barrier" marks only the invalidate queue and a "write memory barrier" marks only the store buffer, while a full-fledged memory
barrier does both。
各种不同CPU硬件的Memory Ordering总结: