- 論壇徽章:
- 0
|
為了保證cache和memory的數(shù)據(jù)一致性,通常有三種方法:
1〉write through:CPU向cache寫入數(shù)據(jù)時,同時向memory也寫一份,使cache和memory的數(shù)據(jù)保持一致。優(yōu)點是簡單,缺點是每次都要訪問memory,速度比較慢。
2〉post write:CPU更新cache數(shù)據(jù)時,把更新的數(shù)據(jù)寫入到一個更新緩沖器,在合適的時候才對memory進行更新。這樣可以提高cache訪問速度,但是,在數(shù)據(jù)連續(xù)被更新兩次以上的時候,緩沖區(qū)將不夠使用,被迫同時更新memory。
3〉write back:CPU更新cache時,只是把更新的cache區(qū)標記一下,并不同步更新memory。只是在cache區(qū)要被新進入的數(shù)據(jù)取代時,才更新memory。這樣做的原因是考慮到很多時候cache存入的是中間結(jié)果,沒有必要同步更新memory。優(yōu)點是CPU執(zhí)行的效率提高,缺點是實現(xiàn)起來技術(shù)比較復(fù)雜。
對于cache的算法。大方面有兩種,Write-Through(通寫)和Write-Back(回寫). Write-Through,也就是說OS發(fā)送的處理data的請求,一直要等到全部memory里面的data正確寫到穩(wěn)定存儲media(如硬盤)中,然后返回給OS報告處理完畢,然后OS才會去update其狀態(tài);這種情況下,通常不會有dirty cache. 而Write-Back,就是在OS發(fā)送處理data的請求后,該算法會將它用buffer存起來,并在沒有正確寫到穩(wěn)定存儲media(如硬盤)中前,就告訴OS處理完畢,然后OS就會去update;但是要是此時掉電或其他故障,buffer的數(shù)據(jù)沒有被寫入穩(wěn)定存儲media(如硬盤),那么os update的信息就和media中的信息不一致.為了避免這樣,所以才用NVRAM,它在調(diào)電后數(shù)據(jù)仍然不丟失,但是在被重新上電后,其數(shù)據(jù)會是dirty的,也就是樓主所提到的dirty cache(如何將dirty cache更新到media,這是Write-Back應(yīng)該做的事)。 這和買賣東西相似,Write-Through就相當(dāng)于你親自去買東西,你買到什么就可以親手拿到;而Write-Back就和中介差不多,你給了中介錢,然后它告訴你說你的東西買到了,然后就相信拿到這個東西了,但是要是出現(xiàn)特殊情況中介跑了(掉鏈子了),你再去檢查,東西原來沒有真正到手。
1.Cache的兩個類型
--Write Through
當(dāng)寫數(shù)據(jù)進Cache時,也同時更新了相應(yīng)的Memory里的內(nèi)容
--Write back
只是寫到Cache里,Memory的內(nèi)容要等到cache保存的要被別的數(shù)據(jù)替換或者系統(tǒng)做cache flush時,才會被更新。
2.Cache的兩個函數(shù)
--Flush
把Cache內(nèi)容寫回Memory,當(dāng)Cache為Write through,不需要Flush
--Invalidate
把Cache內(nèi)容直接丟掉不要。
3.Cache的使用場合
當(dāng)有DMA在使用memory的時候,一般要用到cache的處理。因為DMA在訪問memory時是不經(jīng)過cache的。比較典型的比如在Ethernet,wireless,USB等driver里,DMA會操作descriptors和packet buffers,Driver要做這些處理
--如果driver使用descripter和packet buffer的地址都是cache的地址,那么
a).Driver在讀descripter里一些狀態(tài)比如Owned by CPU/DMA,有沒有收到包時,要對descripter當(dāng)前結(jié)構(gòu)里的內(nèi)容做cache invalidate,收到packet后,也要對packet buffer做cache invalidate
b).Driver在寫descripter里一些狀態(tài)比如Owned by DMA,要發(fā)送包時,要對descripter當(dāng)前結(jié)構(gòu)里的內(nèi)容做cache flush,發(fā)送packet時,也要對packet buffer做cache flush
--有些driver會對descripter使用uncache 地址,那么上面兩種情況里invalidate/flush就不用做了。一般很少會對packet buffer也用uncache地址的,因為對packet內(nèi)容的處理將會很頻繁,使用uncache會很慢。而descripter一般由于結(jié)構(gòu)比較小,如果也使用cache地址的話,做invalidate/flush的時間消耗可能會比uncache的還要多。
本文來自CSDN博客,轉(zhuǎn)載請標明出處:
http://blog.csdn.net/efan_linux/archive/2009/09/23/4584807.aspx
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/58716/showart_2070757.html |
|