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

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 湘潭市| 电白县| 格尔木市| 林口县| 济源市| 平湖市| 涞源县| 柞水县| 安溪县| 黄龙县| 五寨县| 日照市| 嘉黎县| 临江市| 中阳县| 黔东| 长岭县| 东辽县| 乌什县| 南和县| 泽库县| 滕州市| 焦作市| 仙游县| 宁河县| 象州县| 如东县| 酒泉市| 麻城市| 乌审旗| 新余市| 万荣县| 武鸣县| 拜城县| 来凤县| 资阳市| 中宁县| 饶阳县| 安达市| 崇仁县| 佛山市|