1 cpu優化: 緩存
為了提高程序的運行的性能,現代cpu在很多方面對程序進行優化:
例如:cpu的高速緩存,盡可能的避免處理器訪問主內存的時間開銷,處理器大多會利用緩存來提高性能
cpu緩存分為三級緩存:
L1 一級緩存是cpu第一層高速緩存 分為數據緩存和指令緩存 一般服務器的cpu在32-4.96kb
L2 為了提高cpu的運算速度,在cpu外部放置高速存儲器 即二級緩存
L3 現在都是內置的,作用,可以進一步降低內存的延遲,同時提升大數據計算時候處理器的性能,一般死多核公用l3緩存
多處理器時候 單個cpu對緩存中的數據進行改動了,需要通知給其他的cpu 也就意味者,cpu的處理器要控制自己的讀寫操作
還要監聽其他cpu的發出的通知,從而保證緩存的一致性
2 cpu優化:指令重排
指令重排的場景:當cpu的寫緩存時候發現緩存區域正在被其他cpu占用,為了提高cpu的性能,可能會將后面的都緩存指令優先執行
並非隨便重排:需要遵循as-if -serial語義
as-if -serial語義是指: 不管怎么重排序,程序的執行結果不會被改變,編譯器和處理器都會遵循這個語義
也就是說,編譯器和處理器不會對數據存在對的依賴關系的操作做重排序
存在問題:
1 cpu高速緩存下問題:
緩存中的數據與主內存的數據並不是實時同步的,各個cpu間的緩存數據也不是實時同步,各個cpu所看到的同一內存數據可能不一致
2 指令重排:
雖然遵循的as-if -serial 語義 僅僅在單個cpu自己執行的情況下保證結果正確
多核多線程 中,指令邏輯無法分辨因果關聯 可能會出現程序亂執行,導致程序運行結果錯誤
解決方法: cpu提高內存屏障
1 寫內存屏障: 在指令后插入store barrier,能讓寫入緩存的最新數據更新寫入主內存,讓其他線程可見
強制寫入主內存,這個現實調用,cpu就不會因為性能問題去對指令重排
2 讀內存屏障:在指令之前插入load barrier 可以讓緩存緩存中的數據實現,強制從新主內存加載數據
強制讀取主內存內容,讓cpu緩存保持與之內存保持一致,避免了緩存導致的一致性問題