為什麼需要寫緩衝器和無效化佇列
mesi解決了資料一致性問題,但是效能有了瓶頸,處理器在寫記憶體操作時,必須要等到接收到其他處理器的invalidate acknowledge/read response之後才能將資料寫入快取記憶體,為了避免這種情況,設計時引入了寫緩衝器(store buffer/write buffer)寫緩衝器的特點
大小等於一級快取的快取行寬度
乙個處理器不能讀取另乙個處理器的store buffer
處理器在執行寫操作時
如果相應的快取條目為m或e處理器直接將資料寫入快取行,
如果為s會先將資料存入store buffer並傳送invalidate訊息,
如果為i相應的寫未命中(write miss)處理器將資料存入store buffer並傳送read invalidate,
如果其他處理器的快取記憶體都沒有存這個資料,那麼只能從主記憶體讀取資料,因此寫未命中(write miss)的開銷比較大
處理器將資料寫入store buffer之後就認為寫操作已完成,不等待其他處理器返回invalidate acknowledge/read response 繼續執行其他指令,處理器接收到其他處理器返回的invalidate acknowledge訊息的時候會將寫緩衝器對應的條目寫入快取行中,不用等待回覆訊息提高了處理器的執行效率
引入無效化佇列(invalidate queue)
處理器接收到invalidate訊息後不刪除訊息而是將訊息存入invalidate queue之後就回覆invalidate acknowledge減少寫操作執行處理器的等待時間(並不是所有的處理器都有invalidate queue)
寫緩衝器和無效佇列帶來了新的問題---記憶體重排序和可見性問題
寫緩衝器 ,無效化佇列 儲存屏障 載入屏障
先來看一下什麼是快取一致性協議 核心思想 如果變數是共享變數,當其他cpu修改這個變數的時候,發出訊號將其他cpu的變數置為失效狀態,其他cpu再使用這一變數的時候會從記憶體中載入這一變數。修改共享資料的時候,發現相應 快取行的狀態是s,就是共享,說明其他cpu也有副本,這時候要發 無效 的通知出去...
緩衝器溢位指南
push ebp 0x8048441 mov esp,ebp 0x8048443 mov 0xc ebp eax 0x8048446 add 0x4,eax 0x8048449 mov eax edx 0x804844b push edx 0x804844c call 0x8048410 0x804...
ByteBuffer 緩衝器(一)
public static void main final string args bytebuffer bytebuffer bytebuffer.allocate 10 system.out.println 初始位置 bytebuffer.position system.out.println ...