Linux內核學習筆記(八)Page Cache與Page回寫

Page cache是經過將磁盤中的數據緩存到內存中,從而減小磁盤I/O操做,從而提升性能。此外,還要確保在page cache中的數據更改時可以被同步到磁盤上,後者被稱爲page回寫(page writeback)。一個inode對應一個page cache對象,一個page cache對象包含多個物理page。java

對磁盤的數據進行緩存從而提升性能主要是基於兩個因素:第一,磁盤訪問的速度比內存慢好幾個數量級(毫秒和納秒的差距)。第二是被訪問過的數據,有很大機率會被再次訪問。node

Page Cache
Page cache由內存中的物理page組成,其內容對應磁盤上的block。page cache的大小是動態變化的,能夠擴大,也能夠在內存不足時縮小。cache緩存的存儲設備被稱爲後備存儲(backing store),注意咱們在block I/O一文中提到的:一個page一般包含多個block,這些block不必定是連續的。算法

讀Cache
當內核發起一個讀請求時(例如進程發起read()請求),首先會檢查請求的數據是否緩存到了page cache中,若是有,那麼直接從內存中讀取,不須要訪問磁盤,這被稱爲cache命中(cache hit)。若是cache中沒有請求的數據,即cache未命中(cache miss),就必須從磁盤中讀取數據。而後內核將讀取的數據緩存到cache中,這樣後續的讀請求就能夠命中cache了。page能夠只緩存一個文件部分的內容,不須要把整個文件都緩存進來。緩存

寫Cache
當內核發起一個寫請求時(例如進程發起write()請求),一樣是直接往cache中寫入,後備存儲中的內容不會直接更新。內核會將被寫入的page標記爲dirty,並將其加入dirty list中。內核會週期性地將dirty list中的page寫回到磁盤上,從而使磁盤上的數據和內存中緩存的數據一致。性能

Cache回收
Page cache的另外一個重要工做是釋放page,從而釋放內存空間。cache回收的任務是選擇合適的page釋放,而且若是page是dirty的,須要將page寫回到磁盤中再釋放。理想的作法是釋放距離下次訪問時間最久的page,可是很明顯,這是不現實的。下面先介紹LRU算法,而後介紹基於LRU改進的Two-List策略,後者是Linux使用的策略。.net

LRU算法
LRU(least rencently used)算法是選擇最近一次訪問時間最靠前的page,即幹掉最近沒被光顧過的page。原始LRU算法存在的問題是,有些文件只會被訪問一次,可是按照LRU的算法,即便這些文件之後不再會被訪問了,可是若是它們是剛剛被訪問的,就不會被選中。對象

Two-List策略
Two-List策略維護了兩個list,active list 和 inactive list。在active list上的page被認爲是hot的,不能釋放。只有inactive list上的page能夠被釋放的。首次緩存的數據的page會被加入到inactive list中,已經在inactive list中的page若是再次被訪問,就會移入active list中。兩個鏈表都使用了僞LRU算法維護,新的page從尾部加入,移除時從頭部移除,就像隊列同樣。若是active list中page的數量遠大於inactive list,那麼active list頭部的頁面會被移入inactive list中,從而位置兩個表的平衡。
————————————————
版權聲明:本文爲CSDN博主「胡LiuJia」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/damonti...blog

相關文章
相關標籤/搜索