Why Memory Barrier

此文是对阅读文章《Memory Barriers: a Hardware View for Software Hackers》的总结。

另外请参考:Wikipake

MemoryBarrier

Memory Ordering

<<计算机体系结构量化研究>>


在多线程编程中,为什么需要使用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工作方式)。

记住如下图:

Why Memory Barrier

在这种模式下,可以认为: 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总结:

Why Memory Barrier