cpu一級快取
第一層快取記憶體,分為資料快取和指令快取,大小在32~4096kb
cpu二級快取
再次提高cpu的運算速度
cpu**快取
進一步降低記憶體延遲,提公升大資料量計算時處理器的效能。多核共享乙個l3快取。cpu在讀取時,查詢的順序l1->l2->l3->記憶體->外儲存器。
快取同步協議(mesi協議
修改態(modified)此cache已被修改,內容不同於主存,為此cache專有
專有態(exclusive)此cache內容同於主存,但不出現其它cache中
共享態(shared)此cache同於主存,但也出現其它cache中
無效態(invalid)此cache內容無效
多處理器時,單個cpu對快取資料進行改動,需要通知給其它cpu。cpu處理要控制自己的讀寫操作,還要監聽其它cpu發出的通知,從而保證最終一致性
指令重排的場景:當cpu寫快取時發現快取被其他cpu占用,為了提高cpu處理效能,可能將後面的讀快取命令優先執行,並非隨便重排,需要遵守as-if-serial語義
as-if-serial語義:不管怎麼重排序(編譯器和處理器為了提高並行度),(單執行緒)程式的執行結果不能被改變。
也就是說:編譯器和處理器不會對存在資料依賴關係的操作做重排序。
1.cpu快取記憶體下存在的問題:
快取中的資料和主記憶體的資料並不是實時同步的,各個cpu間的快取資料也不是實時同步的。在同乙個時間點,各cpu所看到同一記憶體位址的資料值可能是不一致的。
2.cpu執行指令重排優化存在的問題:
遵守了as-if_serial,但僅在單cpu自己執行的情況能保證結果正確,多核多執行緒中,指令邏輯無法分辨因果關聯,可能出現亂序執行,導致程式執行結果錯誤。
cpu提供了兩個記憶體屏障指令(memory barrier)用於解決上述兩個問題:
寫記憶體屏障
在指令後插入store barrier,能讓寫入快取中的最新資料更新寫入主記憶體,讓其它執行緒可見。強制寫入主內幕才能,這種顯示呼叫,cpu就不會因為效能考慮而去對指令重排。
讀記憶體屏障
在指令前插入load barrier,可以讓快取記憶體中的資料失效,強制重新從主記憶體中載入,讓cpu與主記憶體保持一致,避免了快取導致的一致性問題。
cpu指令重排序的原理
目錄 1.重排序場景 2.追根溯源 3.快取一致性協議 4.重排序原因 一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行...
CPU指令重排序與MESI快取一致性
一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行緒 a 在操作1對共享變數 a 的寫入?答案是 不一定能看到。由於操作1...
CPU的重排序與MESI快取一致性
一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行緒 a 在操作1對共享變數 a 的寫入?答案是 不一定能看到。由於操作1...