標籤:des style color os 使用 strong ar 資料 art
Cache 的write back和write through 收藏
為了保證cache和memory的資料一致性,通常有三種方法:
1〉write through:CPU向cache寫入資料時,同時向memory也寫一份,使cache和memory的資料保持一致。優點是簡單,缺點是每次都要訪問memory,速度比較慢。
2〉post write:CPU更新cache資料時,把更新的資料寫入到一個更新緩衝器,在合適的時候才對memory進行更新。這樣可以提高cache訪問速度,但是,在資料連續被更新兩次以上的時候,緩衝區將不夠使用,被迫同時更新memory。
3〉write back:CPU更新cache時,只是把更新的cache區標記一下,並不同步更新memory。只是在cache區要被新進入的資料取代時,才更新memory。這樣做的原因是考慮到很多時候cache存入的是中間結果,沒有必要同步更新memory。優點是CPU執行的效率提高,缺點是實現起來技術比較複雜。
| 回寫與透寫 |
| |
| |
| 對於cache的演算法。大方面有兩種,Write-Through(通寫)和Write-Back(回寫). Write-Through,也就是說OS發送的處理data的請求,一直要等到全部memory裡面的data正確寫到穩定儲存media(如硬碟)中,然後返回給OS報告處理完畢,然後OS才會去update其狀態;這種情況下,通常不會有dirty cache. 而Write-Back,就是在OS發送處理data的請求後,該演算法會將它用buffer存起來,並在沒有正確寫到穩定儲存media(如硬碟)中前,就告訴OS處理完畢,然後OS就會去update;但是要是此時掉電或其他故障,buffer的資料沒有被寫入穩定儲存media(如硬碟),那麼os update的資訊就和media中的資訊不一致.為了避免這樣,所以才用NVRAM,它在調電後資料仍然不丟失,但是在被重新上電後,其資料會是dirty的,也就是樓主所提到的dirty cache(如何將dirty cache更新到media,這是Write-Back應該做的事)。 這和買賣東西相似,Write-Through就相當於你親自去買東西,你買到什麼就可以親手拿到;而Write-Back就和中介差不多,你給了中介錢,然後它告訴你說你的東西買到了,然後就相信拿到這個東西了,但是要是出現特殊情況中介跑了(掉鏈子了),你再去檢查,東西原來沒有真正到手。 |
|
1.Cache的兩個類型
--Write Through
當寫資料進Cache時,也同時更新了相應的Memory裡的內容
--Write back
只是寫到Cache裡,Memory的內容要等到cache儲存的要被別的資料替換或者系統做cache flush時,才會被更新。
2.Cache的兩個函數
--Flush
把Cache內容寫回Memory,當Cache為Write through,不需要Flush
--Invalidate
把Cache內容直接丟掉不要。
3.Cache的使用場合
當有DMA在使用memory的時候,一般要用到cache的處理。因為DMA在訪問memory時是不經過cache的。比較典型的比如在Ethernet,wireless,USB等driver裡,DMA會操作descriptors和packet buffers,Driver要做這些處理
--如果driver使用descripter和packet buffer的地址都是cache的地址,那麼
a).Driver在讀descripter裡一些狀態比如Owned by CPU/DMA,有沒有收到包時,要對descripter當前結構裡的內容做cache invalidate,收到packet後,也要對packet buffer做cache invalidate
b).Driver在寫descripter裡一些狀態比如Owned by DMA,要發送包時,要對descripter當前結構裡的內容做cache flush,發送packet時,也要對packet buffer做cache flush
--有些driver會對descripter使用uncache 地址,那麼上面兩種情況裡invalidate/flush就不用做了。一般很少會對packet buffer也用uncache地址的,因為對packet內容的處理將會很頻繁,使用uncache會很慢。而descripter一般由於結構比較小,如果也使用cache地址的話,做invalidate/flush的時間消耗可能會比uncache的還要多。
Cache 的write back和write through