無論在硬體設計還是軟體架構中,高速緩存都是提升效能的關鍵手段。Linux 核心採用多種與記憶體管理緊密相關的快取機制,主要包含緩衝區高速緩存、頁面高速緩存、交換高速緩存以及硬體高速緩存四大類。
緩衝區高速緩存專門用於區塊設備的資料暫存,包含從設備讀取或待寫入設備的資料區塊。核心透過設備識別號與區塊編號索引緩衝區,能快速定位資料。若資料已存在於緩衝區,系統即可避免對實體區塊設備發起實際讀取操作。
為了協調寫入操作,核心為每個緩衝區維護額外資訊:一個「髒」位標記記憶體中的緩衝區已被修改,必須寫回磁碟;一個時間戳記錄緩衝區在刷新至磁碟前已在記憶體駐留多久。這些中繼資料連同使用者資料一同儲存在緩衝區首部,因此需要統一管理。
緩衝區高速緩存的大小可動態調整。當需要新緩衝區但無可用空間時,核心會按需分配頁面;當閒置記憶體不足時,則釋放緩衝區並重複利用對應頁面。
頁面高速緩存是頁面 I/O 操作存取資料的磁碟快取。在檔案系統中,read()、write() 和 mmap() 等系統呼叫對普通檔案的存取均透過頁面高速緩存完成。由於頁面 I/O 以整頁為傳輸單位,快取中的基本單元即為一個完整頁面。一個頁面包含的資料在物理上未必相鄰,因此無法用設備號與區塊號索引,而是透過檔案的索引節點與檔案內偏移量來標識頁面。
與頁面高速緩存相關的核心操作主要有三種:當存取的檔案部分不在快取中時新增頁面;當快取過大時移除頁面;以及查找給定檔案偏移量所在的頁面。
只有經修改的(髒)頁面會被保存至交換檔案。修改後的頁面寫入交換檔後,若該頁面再次被交換出去但未被修改,則無需重複寫入,只需捨棄該頁面即可。交換高速緩存實際包含一個頁面表項鏈表,系統每個物理頁面對應一個頁面表項。對於已交換出的頁面,頁面表項記錄其所在交換檔案及位置資訊。若某交換頁面表項非零,表示交換檔中對應的物理頁面未被修改;若後續操作修改該頁面,則將交換緩存中的頁面表項清零。
當 Linux 需從物理記憶體交換出某頁面時,會先檢查交換緩存資訊。若緩存包含該物理頁面的非零頁面表項,說明該頁面交換出後未被修改,系統只需捨棄該頁面,避免重複 I/O。
相關核心函數(位於 /linux/mm/swap_state.c)包括:
init_swap_cache():初始化交換緩衝,設定大小與位置show_swap_cache_info():顯示交換緩衝資訊add_to_swap_cache():加入交換緩衝swap_duplicate():複製被換出頁面(用於 fork() 時子進程繼承換出頁面)delete_from_swap_cache():從緩衝區移除某頁面常見的硬體快取針對頁面表項,由處理器自動管理,操作細節與具體處理器硬體相關,但軟體需負責管理協調。後續章節將進一步闡述。