内存排序是指CPU访问主存时的顺序。可以是编译器在编译时产生,也可以是CPU在运行时产生。反映了内存操作重排序,乱序执行,从而充分利用不同内存的总线带宽。
现代处理器大都是乱序执行。因此需要内存屏障以确保多线程的同步。
编译时内存排序
编译时内存屏障
这些内存屏障阻止编译器在编译时乱序指令,但在运行时无效。
- GNU内联汇编语句
asm volatile("" ::: "memory");
或者
__asm__ __volatile__ ("" ::: "memory");
阻止GCC编译器跨越它乱序读/写指令。
- C11/C++11
atomic_signal_fence(memory_order_acq_rel);
阻止编译器跨越它乱序读/写指令。
*Intel_C++編譯器使用"full compiler fence"
__memory_barrier()
指令。
- Microsoft Visual C++编译器:
_ReadWriteBarrier()
运行时内存排序
*happens-before:按照程序的代码序执行
*synchronized-with:不同线程间,对于同一个原子操作,需要同步关系,store()操作一定要先于 load(),也就是说 对于一个原子变量x,先写x,然后读x是一个同步的操作
对称多处理器(SMP)系统
对称多处理器(SMP)系统有多个内存一致模型。
*顺序一致(Sequential consistency):同一个线程的原子操作还是按照happens-before关系,但不同线程间的执行关系是任意
*松弛一致(Relaxed consistency,允许某种类型的重排序):如果某个操作只要求是原子操作,除此之外,不需要其它同步的保障,就可以使用 Relaxed ordering。程序计数器是一种典型的应用场景
*弱一致(Weak consistency):读写任意排序,受显式的内存屏障限制。
某些老的x86有更弱内存序。
SPARC 内存序:
- SPARC TSO = total store order (default)
- SPARC RMO = relaxed-memory order (not supported on recent CPUs)
- SPARC PSO = partial store order (not supported on recent CPUs)
硬件内存屏障
*x86, x86-64
lfence (asm), void _mm_lfence(void)
sfence (asm), void _mm_sfence(void)
mfence (asm), void _mm_mfence(void)
*PowerPC
sync (asm)
*MIPS
sync (asm)
*Itanium
mf (asm)
*POWER
dcs (asm)
*ARMv7
dmb (asm)
dsb (asm)
isb (asm)
编译器对硬件内存屏障的支持
*GCC, version 4.4.0 and later, has __sync_synchronize.
*C11/C++11 atomic_thread_fence()支持一条命令
*Microsoft Visual C++ has MemoryBarrier().
*Sun Studio Compiler Suite has __machine_r_barrier, __machine_w_barrier and __machine_rw_barrier.
参见
*
参考文献
进一步阅读
- Computer Architecture — A quantitative approach. 4th edition. J Hennessy, D Patterson, 2007. Chapter 4.6
- Sarita V. Adve, Kourosh Gharachorloo, [http://www.ai.mit.edu/projects/aries/papers/consistency/computer_29_12_dec1996_p66.pdf Shared Memory Consistency Models: A Tutorial]
- [http://www.intel.com/products/processor/manuals/318147.pdf Intel 64 Architecture Memory Ordering White Paper]
- [http://www.linuxjournal.com/article/8211 Memory ordering in Modern Microprocessors part 1]
- [http://www.linuxjournal.com/article/8212 Memory ordering in Modern Microprocessors part 2]
- - Google Tech Talk
评论 (0)