posts - 1,  comments - 25,  trackbacks - 0

          優化屏障和內存屏障

          優化屏障 (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 閱讀(609) 評論(0)  編輯  收藏 所屬分類: CoreJava
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 扎鲁特旗| 北宁市| 全南县| 左权县| 兰坪| 皋兰县| 信阳市| 深州市| 遂昌县| 九龙县| 璧山县| 辽宁省| 昭觉县| 高台县| 安塞县| 沙雅县| 兰坪| 筠连县| 崇左市| 武隆县| 天长市| 淳安县| 博野县| 石嘴山市| 罗甸县| 乐安县| 黄大仙区| 堆龙德庆县| 英吉沙县| 桂林市| 淮安市| 黄平县| 罗源县| 沅陵县| 黔东| 高邮市| 福州市| 金川县| 临潭县| 同江市| 东宁县|