?待續
Memory barrier,是一種屏障和一類指令,在執行這個屏障指令前后,CPU或者編譯器在內存操作上強制一個約束序列。CPU使用性能優化器可以導致執行代碼的無序。在單一線程執行中,重排序內存操作通常不會被注意。但是在并行編程或者設備驅動中會導致不可預料的行為。確切的排序約束是依賴于硬件的,并且有系統結構的內存模型所定義。一些結構提供多個屏障來強制不同的排序約束。內存約束通常使用在低級的機器碼中,用在多個設備中操作內存的時候。這些代碼包括在多處理器系統和硬件驅動開發中同步初始的鎖數據結構。
?
當程序運行在單一CPU上。硬件執行必須的記錄工作來保證程序按照程序員指定的序列順序執行,因此memory barriers鄙視必須的。但是,當內存由多個設備共享的時候,比如多個CPU系統,或者無序訪問可能影響程序的行為。比如第二個CPU可能看到內存由第一個CPU改變,其執行序列并不是程序規定的序列。
下面給出了一個具體的例子來說明無序執行怎樣影響程序的行為。初始的,內存地址x和f的值都是0,當f的值是0的時候,程序在處理器1上循環,然后打印出x的值。處理器2上的程序把值42存入x,把1存入f。下面是偽代碼片段,程序并行的在各個處理器上執行。
?
多線程編程通常使用由高級語言環境提供的的同步機制,比如java和.net,或者API比如POSIX線程或者Win32。初始的比如Mutex和Semaphores用來在并行線程執行的時候同步訪問資源。這些通常都需要提供memory barriers來執行,來保證內存可視。在這種環境中,直接顯示調用memory barriers通常都不是必須的。
每個API或者程序環境在并行情況下都有自己的高級內存模型,來定義內存的可視語義。盡管程序員通常不需要在高級開發環境中使用memory barriers,理解內存可視語義也是很重要的。
本文轉自cnn23711151CTO博客,原文鏈接:?http://blog.51cto.com/cnn237111/524552,如需轉載請自行聯系原作者