目的:避免指令重新排序。
优化屏障:保证编译器程序不会混淆放在原语操作之前的汇编语言指令和放在原语操作之后的汇编语言指令。在linux中,优化屏障是barrier()。展开为asm volatile("":::"memory")。指令asm告诉编译器程序要插入汇编语言片段,volatile禁止编译器把asm指令与程序中的其他指令重新组合。使得编译器不能使用存放在cpu寄存器中的内存单元的值来优化asm指令前的代码,但并不保证不使当前cpu把汇编语言指令混在一起执行———这是内存屏障的工作。
内存屏障:确保原语之后的操作开始执行之前,原语之前的操作已经完成。因此,内存屏障类似于防火墙,让任何汇编语言指令都不能通过。linux中使用六个内存屏障原语,这些原语也被当做优化屏障。
mb() 单处理器与多处理器内存屏障
rmb() 单处理器与多处理器读内存屏障
wmb() 单处理器与多处理器写内存屏障
smp_mb() 多处理器内存屏障
smp_rmb() 多处理器读内存屏障
smp_wmb() 多处理器写内存屏障
如果CPU支lfence汇编语言指令,就把rmb()宏展开为asm volatile("lfence"),否则展开为asm volatile("lock;addl $0,0(%%esp)":::"memory")
原文地址:http://muyunzhe.blog.51cto.com/9164050/1659555