檔案系統實作

緩衝快取(buffer cache)

磁碟比記憶體慢上數千倍,所以一次又一次從磁碟讀同一個區塊,就像為了每一個小事實都開車去圖書館,明明可以把書攤開在桌上就好。緩衝快取就是核心的書桌:一塊存放近期用過之磁碟區塊的 RAM,使得重複的讀取由記憶體供應,而寫入可以先累積,之後才落到慢速的磁碟。

它雙向運作。讀取時,檔案系統先檢查快取;若區塊在裡面(命中),就立即回傳、完全不碰磁碟,若不在(失誤),就從磁碟讀,並留一份副本以備下次。兩個最佳化帶來巨大差別。預讀(預取)察覺到循序存取,在你開口前就先取後面幾個區塊,所以串流一個檔案時很少要等磁碟。延後寫入(延遲寫)讓寫入只要資料進到快取就立即返回,把區塊標記為髒,稍後在背景才沖刷到磁碟——這把許多小寫入打包,並讓作業系統有效率地重排它們。在現代系統上,檔案緩衝快取與虛擬記憶體的頁面快取通常合而為一成單一的頁面快取,使記憶體映射檔案與一般讀取共用相同的快取頁面。

緩衝快取是電腦感覺很快的最大原因之一:多數檔案存取根本不碰磁碟。但延後寫入帶著一個誠實的風險——若機器在髒區塊仍在快取、尚未落到磁碟時斷電,那些寫入就遺失了。這正是為什麼必須確保的程式(資料庫、正在存檔的編輯器)會呼叫 fsync 強迫快取寫到磁碟,也是為什麼檔案系統使用日誌,讓沖刷途中的當機留下可復原的狀態,而不是毀損的狀態。

連續開啟同一個設定檔兩次:第一次讀取要到磁碟、很慢;第二次瞬間完成,因為區塊還在快取裡。同時,存檔一份文件會立刻返回——資料以髒狀態待在快取,一秒後由背景沖刷寫到磁碟。

熱門區塊由 RAM 供應,寫入打包並延後——快取隱藏了磁碟大部分的緩慢。

延後(延遲)寫入意味著一次存檔在你的程式中可以成功,卻仍可能在沖刷前的斷電中遺失。fsync 強迫資料寫出;沒有它,緩衝快取的速度伴隨著一個持久性的缺口。

又稱
page cacheunified buffer cachedisk cache頁面快取磁碟快取