本節書摘來自華章出版社《深入淺出dpdk》一書中的第2章,第2.4節cache的寫政策,作者朱河清,梁存銘,胡雪焜,曹水 等,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
2.4 cache的寫政策
記憶體的資料被加載到cache後,在某個時刻其要被寫回記憶體,對于這個時刻的選取,有如下幾個不同的政策。
直寫(write-through):所謂直寫,就是指在處理器對cache寫入的同時,将資料寫入到記憶體中。這種政策保證了在任何時刻,記憶體的資料和cache中的資料都是同步的,這種方式簡單、可靠。但由于處理器每次對cache更新時都要對記憶體進行寫操作,是以總線工作繁忙,記憶體的帶寬被大大占用,是以運作速度會受到影響。假設一段程式在頻繁地修改一個局部變量,盡管這個局部變量的生命周期很短,而且其他程序/線程也用不到它,cpu依然會頻繁地在cache和記憶體之間交換資料,造成不必要的帶寬損失。
回寫(write-back):回寫相對于直寫而言是一種高效的方法。直寫不僅浪費時間,而且有時是不必要的,比如上文提到的局部變量的例子。回寫系統通過将cache line的标志位字段添加一個dirty标志位,當處理器在改寫了某個cache line後,并不是馬上把其寫回記憶體,而是将該cache line的dirty标志設定為1。當處理器再次修改該cache line并且寫回到cache中,查表發現該dirty位已經為1,則先将cache line内容寫回到記憶體中相應的位置,再将新資料寫到cache中。其實,回寫政策在多核系統中會引起cache一緻性的問題。設想有兩個處理器核心都需要對某個記憶體塊進行讀寫,其中一個核心已經修改了該資料塊,并且寫回到cache中,設定了dirty位;這時另外一個核心也完成了該記憶體塊的修改,并且準備寫入到cache中,這時才發現該cache line是“髒”的,在這種情況下,cache如何處理呢?之後的章節我們會繼續這個話題。
除了上述這兩種寫政策,還有wc(write-combining)和uc(uncacheable)。這兩種政策都是針對特殊的位址空間來使用的。
write-combining政策是針對于具體裝置記憶體(如顯示卡的ram)的一種優化處理政策。對于這些裝置來說,資料從cache到記憶體轉移的開銷比直接通路相應的記憶體的開銷還要高得多,是以應該盡量避免過多的資料轉移。試想,如果一個cache line裡的字被改寫了,處理器将其寫回記憶體,緊接着又一個字被改寫了,處理器又将該cache line寫回記憶體,這樣就顯得低效,符合這種情況的一個例子就是顯示屏上水準相連的像素點資料。write-combining政策的引入就是為了解決這種問題,顧名思義,這種政策就是當一個cache line裡的資料一個字一個字地都被改寫完了之後,才将該cache line寫回到記憶體中。
uncacheable記憶體是一部分特殊的記憶體,比如pci裝置的i/o空間通過mmio方式被映射成記憶體來通路。這種記憶體是不能緩存在cache中的,因為裝置驅動在修改這種記憶體時,總是期望這種改變能夠盡快通過總線寫回到裝置内部,進而驅動裝置做出相應的動作。如果放在cache中,硬體就無法收到指令。