Cache寫策略(Cache一致性問題與騷操作)

2022-01-18 05:36:34 字數 2021 閱讀 2782

資訊會被同時寫到cache的塊和主存中。這樣做雖然比較慢,但缺少代價小,不需要把整個塊都寫回主存。也不會發生一致性問題。

對於寫直達,多出來%10向主存寫入的儲存指令使得其比其單純向cache寫入的速度慢上將近10倍。這種速度不一致的問題,不管是在硬體結構還是軟體,有著一條「不管怎麼樣,先試試這樣行不行」的辦法:並行加緩衝。

我們使用寫緩衝(write buffer)來解決這個問題,cpu寫入cache的同時會寫入write buffer。緩衝中的內容什麼時候寫入主存交給存控(memory controller)來控制,cpu將省下的時間去處理其他事情。

write buffer是乙個fifo佇列,一般只有4位元組。

然而當寫操作頻繁的時候,這點容量就不夠用了,容易飽和發生阻塞,就相當於沒加一樣...

解決的辦法可以是再加一級cache,變成二級快取。什麼,你問為什麼不把兩級cache和一起,搞那麼多幹什麼?這個二級當然是慢一點的便宜貨,咱們弄這些東西,不就是因為越快東西越貴,買不起嘛土豪!

對於緩衝的問題,還有個關於合併寫對程式效率的影響, 具體可以參考這篇博文。

第二種辦法就是改變策略使用寫回,也就是下面介紹的方法。

資訊僅僅寫到cache中的塊。當其被替換時,資訊才會被寫回到主存中。虛擬儲存器系統通常採用寫回策略,因為寫到磁碟的延遲代價太大。

寫回的速度要更快一些,因為不必每次寫操作都訪問主存。但這樣我們如何保證一致性問題呢?我們可以給每行新增乙個髒位(dirty bit),這樣我們替換這塊cache時就可以根據髒位來判斷是否需要寫回主存。如果沒有被「弄髒過」,那麼就不需要寫回主存。

不過對於同一塊cache中的變數x,他不是太喜歡這個機制。因為它的鄰居y老是被修改,導致x這個只被讀取的變數老得往記憶體跑,它不想跟y待在一起了,太累人了。

聆聽了x的心聲,我們有什麼辦法可以幫助它嗎?辦法當然是有的,讓y這個煩人的傢伙單獨待著就行。下面分別執行兩個程式,排除首次裝入的影響(其實寫一塊也行,對齊的技巧源自disruptor)

public class padding 

public static x arrx=new x[2];

static

public static void main(string args) throws interruptedexception );

thread thread2=new thread(()->);

final long start=system.nanotime();

thread1.start();

thread2.start();

thread1.join();

thread2.join();

system.out.println((system.nanotime()-start)/1_000_000);}}

package mytask;

public class nopadding

public static x arrx=new x[2];

static

public static void main(string args) throws interruptedexception );

thread thread2=new thread(()->);

final long start=system.nanotime();

thread1.start();

thread2.start();

thread1.join();

thread2.join();

system.out.println((system.nanotime()-start)/1_000_000);}}

對於寫不命中,有兩者方法:寫分配與非寫分配。前者利用空間區域性性,每次都從主存中讀取乙個塊裝入cache更新相應單元。後者則是直接寫主存單元,不將主存塊裝入cache。

Cache的寫策略

write through 直寫模式 在資料更新時,同時寫入快取cache和後端儲存。此模式的優點是操作簡單 缺點是因為資料修改需要同時寫入儲存,資料寫入速度較慢。write back 回寫模式 在資料更新時只寫入快取cache。只在資料被替換出快取時,被修改的快取資料才會被寫到後端儲存。常見處理器...

Cache 快取一致性

就硬體而言,cpu 晶元 處理器 記憶體 匯流排 磁碟等等,構成了一台電腦,當電腦執行乙個程式的時候,需要從磁碟讀到主記憶體,主記憶體再到快取,最後交由cpu執行。隨著現在的多核處理器的發展,運算的速度是越來越快,但是在運算的同時,也要遇到快取一致性的問題,簡單來說,多核處理器,每個核上有個多個處理...

Cache與一致性

3 知識點摘記 3.2 編譯屏障和記憶體屏障 參考文獻 對於cache cache一致性 記憶體一致性 記憶體屏障 原子操作等話題,涉及到很多處理器體系結構的細節,比較難懂。本文不會系統的分析這些問題,一是水平有限,二是工作量太大,三是目前已經有相關的高質量書籍和網路資料。所以本文著力收集一些相關話...