優化屏障和內存屏障
優化屏障 (Optimization Barrier)
編譯器編譯源代碼時,會將源代碼進行優化,將源代碼的指令進行重排序,以適合于CPU的并行執行。然而,內核同步必須避免指令重新排序,優化屏障(Optimization barrier)避免編譯器的重排序優化操作,保證編譯程序時在優化屏障之前的指令不會在優化屏障之后執行。
Linux用宏barrier實現優化屏障,gcc編譯器的優化屏障宏定義列出如下(在include/linux/compiler-gcc.h中):
#define barrier() __asm__ __volatile__("": : :"memory")
上述定義中,“__asm__”表示插入了匯編語言程序,“__volatile__”表示阻止編譯器對該值進行優化,確保變量使用了用戶定義的精確地址,而不是裝有同一信息的一些別名。“memory”表示指令修改了內存單元。
內存屏障 (Memory Barrier)
軟件可通過讀寫屏障強制內存訪問次序。讀寫屏障像一堵墻,所有在設置讀寫屏障之前發起的內存訪問,必須先于在設置屏障之后發起的內存訪問之前完成,確保內存訪問按程序的順序完成。
讀寫屏障通過處理器構架的特殊指令mfence(內存屏障)、lfence(讀屏障)和sfence(寫屏障)完成,見《x86-64構架規范》一章。另外,在x86-64處理器中,對硬件進行操作的匯編語言指令是“串行的”,也具有內存屏障的作用,如:對I/O端口進行操作的所有指令、帶lock前綴的指令以及寫控制寄存器、系統寄存器或調試寄存器的所有指令(如:cli和sti)。
Linux內核提供的內存屏障API函數說明如表2。內存屏障可用于多處理器和單處理器系統,如果僅用于多處理器系統,就使用smp_xxx函數,在單處理器系統上,它們什么都不要。
posted on 2012-06-25 12:05
Daniel 閱讀(604)
評論(0) 編輯 收藏 所屬分類:
CoreJava