章節目錄
- 1.重排序定義
- 2.數據依賴性
- 3.as-if-serial語義
- 4.程序順序規則
- 5.JMM 參考 順序一致性內存模型的實踐規范
1.重排序定義
重排序是指編譯器和處理器為優化程序性能而對指令序列重新排序的一種手段。
2.數據依賴性
如果兩個操作訪問同一個變量,且兩個操作中有一個為寫操作,此時這兩個操作之間就存在數據依賴性。
如下表所示,是我們常見的數據依賴性場景:
操作模式 | 代碼示例 | 說明 |
---|---|---|
store->load | a=1; b=a; |
寫一個變量后,再讀這個位置 |
store->store | a=1; a=2 |
寫一個變量之后,再寫這個變量 |
load->store | a=b; b=1 |
讀一個變量之后,再寫這個變量 |
注意:
上述指令重排序之后,執行結果就會發生變化,所以編譯器和處理器不會改變存在數據依賴關系的兩個操作的執行順序。僅針對于單個處理器中執行的指令序列和單個線程中執行的操作。
3.as-if-serial 語義
對于不存在數據依賴性的操作可以做指令重排序。as-if-serial語義把單線程程序保護了起來。
4.程序順序規則
如果A happens-before B,注意happens-before定義的不是A,B操作執行的順序是A先B后,,而是A操作的結果對B操作的結果可見,且A操作的結果按順序排在B操作結果之前,所以進行指令重排序必須保證的前提是不改變程序執行結果。
5.JMM 參考 順序一致性內存模型的實踐規范
- 1.JMM采用共享內存模型通過通過控制共享內存與每個線程本地內存之間的交互,來提供內存可見性保證。
- 2.JMM通過指令重排序來優化程序執行性能,但不正確的重排序會破壞多線程程序的語義,程序運行結果出現非預想的情況。
- 3.JMM參考順序一致性內存模型,(但不能完全實現,比如在非同步多線程程序下),來對正確同步的多線程程序做了如下保證-程序的執行結果與該程序在順序一致性內存模型中的執行結果相同,但正確同步的多線程程序在執行過程中可以對臨界區內不存在數據依賴的指令行進行重排序,以在保證執行結果正確的情況下通過指令重排序對程序運行性能做提升。