Linux核心設計與實現 十六 頁快取記憶體和頁回寫

2021-10-25 22:16:13 字數 1933 閱讀 2908

概念

linux核心實現磁碟快取,將磁碟中的資料快取到物理記憶體中,把對磁碟的訪問變為對物理記憶體的訪問。可以減少對磁碟的i/o操作。

效能提公升

●訪問磁碟的速度要遠低於訪問記憶體的速度。因此從記憶體訪問資料比從磁碟訪問更快。

●資料一旦被訪問,就很有可能在短期內再次被訪問到。

頁快取記憶體是由記憶體中的物理頁面組成的,其內容對應磁碟上的物理課。

當核心開始讀操作,會首先檢查需要的資料是否在頁快取記憶體中。

程序寫磁碟時,快取使用方式:

●不快取:

快取記憶體不去快取任何寫操作。當對快取中的資料片進行寫時,將直接跳過快取,寫到磁碟,同時也使快取中的資料失效。這種策略效率較低

●寫透快取

寫操作會更新快取,同時更新磁碟檔案。寫操作會立刻穿透快取到磁碟中。這種策略對保持快取一致性很有好處。

●回寫(linux採用)

程式直接寫到快取中,後端儲存不會立刻直接更新,而是將頁快取記憶體中被寫入的頁面標記成「髒」,並加入髒頁鍊錶中。然後由乙個回寫程序週期將髒頁鍊錶中的頁寫回到磁碟,保持磁碟和記憶體資料一致,並清理「髒」頁標誌。

原因

快取演算法最後涉及的重要內容是快取中的資料如何清除:如為更重要的快取項騰出位置,或者是收縮快取大小,騰出記憶體給其他地方使用。

做法

linux快取**是通過選擇乾淨頁(不髒)進行簡單替換,如果快取中沒有足夠的乾淨頁面,核心將強制地進行回寫操作,**髒頁,以騰出更多的乾淨可用頁。

**策略

●理想**策略:**以後最不可能使用的頁面。但這種策略太理想,無法真正實現。

●最近最少使用(lru):

思想:lru**策略跟蹤每個頁面的訪問蹤跡,以便能**最老時間戳的頁面。

優點:該策略的良好效果源自於快取的資料越久未被訪問,則月不大可能近期再被訪問,而最近訪問的最有可能被再次訪問。

缺點:許多檔案被訪問一次,再不被訪問的情景下,lru效果很差,將這些頁面放在lru鏈的頂端顯然不是最優。

●雙鏈策略(lru/2)

linux實現的是乙個修改過的lru,也稱為雙鏈策略。linux維護的不再是乙個lru鍊錶,而是維護兩個鍊錶:活躍聯播和非活躍鍊錶。活躍鍊錶上的頁面不會被換出,而非活躍鍊錶上的頁面則是可以被換出的。

兩個鍊錶需要保持平衡,如果活躍鍊錶超過了非活躍鍊錶,那麼活躍鍊錶的頭頁面將會重新移回到非活躍鍊錶中,以便能再次**,就可以解決傳統lru演算法中僅訪問一次的問題。

開啟大量原始檔時,檔案儲存在頁快取記憶體中,從乙個檔案跳到另乙個檔案將瞬間完成。

編輯檔案時,儲存檔案也會瞬間完成,因為寫操作只需要寫到記憶體,而不是磁碟。

編譯專案時,快取的檔案將使得編譯過程更少訪問磁碟,所以編譯的速度就加快了。

本節剖析具體的資料結構以及核心如何使用它們管理快取。

linux頁快取記憶體使用了乙個新物件管理快取項和頁i/o操作。該結構體是虛擬位址vm_area_struct的實體地址對等體。

具體見書

對於linux來說,2.4之前的核心中有兩種快取,一種是vfs的頁快取記憶體,另外一種是緩衝區快取記憶體,實際上緩衝區對應於磁碟塊,就是磁碟塊在記憶體中的表示罷了,其中的資料也還是檔案中的資料,只不過頁快取記憶體是按照頁面管理的,而緩衝區快取記憶體是按照塊來管理的,兩個快取在資料本身上有一定的重合,這就造成了冗餘,在核心中是很不好的,比如123456是頁快取記憶體的資料,到了緩衝區快取記憶體,其實還是123456,只不過不再這麼排列了,而是分成了一塊一塊的,比如1,2,3,…如果能將這些1,2,3指向頁快取記憶體,那麼就可以不再需要為緩衝區快取記憶體分配大量的記憶體空間了。2.4往後的核心就是這麼做的,到了2.6核心,有了bio,那麼buffer_head再也不用作為io容器了

由於頁快取記憶體的快取作用,寫操作實際上會被延遲。flusher執行緒在系統中的空閒記憶體低於乙個特定的閾值時,將髒頁重新整理寫回磁碟。

linux核心設計與實現讀書筆記 頁快取記憶體

一 頁快取記憶體 內容對應磁碟上的物理塊的記憶體物理頁面。寫快取實現策略 1 nonwrite 直接寫磁碟,同時將快取中資料失效。2 write through cache 自動更新記憶體快取同時更新磁碟檔案。3 寫回 寫到快取中並標記頁面為臟,加入髒頁鍊錶中,由寫回程序週期性寫回磁碟。linux使...

linux 核心設計與實現相關

有待繼續補充。第一章 linux核心簡介 需要注意 核心開發其實並不難。第二章 從核心出發 核心開發需要注意 1 沒有c庫,c庫太大了 2 沒有記憶體保護機制 3 不要輕易使用浮點數 4 可移植的重要性 5 同步和併發 疑問 編譯和安裝核心?必須在linux下麼?其他機器安裝了gcc編譯器呢?能否編...

Linux核心設計與實現總結。

1.程序管理。本章主要是介紹程序的乙個靜態的狀態,包括系統如何組織程序。建立,啟動,到最後死亡的乙個概念性認識,沒有更加深刻的知識。2.程序排程。本章比較重要。1.搶占式排程策略。2.倆程序間上下文切換 有倆函式 switch mm 和 switch to倆函式完成此功能。具體細節需要閱讀其他書籍 ...