緩存與指令亂序執行怎麼回事-CPU層面知識

緩存與指令亂序到底是怎麼回事

緩存

首先我們要明白緩存的出現是爲了加速程序的執行過程,提升效率。爲什麼這樣說呢?因爲程序的執行是在CPU中來完成的,而程序的駐留地確實硬盤,程序需要先從硬盤加載到內存,然後再讀入CPU當中才能執行,而硬盤、內存、CPU的讀寫數據能力相差極大(好幾個數量級),爲了緩解三者之間讀寫數據速度問題,因此引入了緩存,緩存一般在CPU當中(一般有三層緩存)。

塊處理

在引入緩存後,出現了一種塊處理方式(讀取數據進入緩存時會將所需數據和與之相鄰的數據都讀入緩存【相鄰數據可能爲下次所需數據】)這樣讀入緩存的總是一塊數據。

緩存一致性問題

引入緩存後,這樣數據可能分佈在不同的物理存儲塊上,這樣會引發一種問題,各物理塊上的數據可能存在數據不一致問題即緩存一致性問題。

解決辦法

1.常用 MESI(Modified Exclusive Shared Or Invalid)(也稱爲伊利諾斯協議,是因爲該協議由伊利諾斯州立大學提出)是一種廣泛使用的支持寫回策略的緩存一致性協議
2.鎖總線
注:參考 緩存一致性協議

指令亂序

爲了進一步提升程序的運行效率,一般在CPU層面將會允許指令重排序。那麼什麼是指令重排序呢?
程序中指令順序爲:
order1
order2
order3

但在執行時並不一定按照上述順序執行,這個過程稱爲指令重排序。如果程序只在單線程下運行,這樣執行並沒有什麼影響(會有個結果一致性來確保程序執行結果的準確性),但在多線程環境下這樣亂序執行則無法保證結果的準確性(線程間存在共享資源時)。

禁止亂序

1.CPU層面:可通過一些原語來處理
2.jvm:hanppens-before原則 和內存屏障

注:
jvm層面的解決實際上還是得依靠虛擬機的最終實現(實際還得歸到CPU層)我們應該認識到jvm只是一箇中間平臺,具體解決還得看CPU
原語:控制硬件的彙編語言
內存屏障:只是個名詞而已,相當於在兩條指令之間加了個隔斷,上下指令不能重排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章