檔案系統與儲存

目錄項快取(dentry cache,dcache)

/ dentry = DEN-tree /

每次你開啟 /home/sam/notes/today.txt,核心都必須把那條路徑一次一個名字地轉譯成真正的檔案:先在 / 裡找到 home、再在 home 裡找 sam、再找 notes、再找 today.txt。若每一次開啟都從磁碟做完整查找會慢得令人痛苦,因為同樣的目錄被一遍又一遍地走訪。於是核心把它已經算出來的「名字到 inode」步驟保留在一個快速的記憶體快取裡。那個快取就是目錄項快取,幾乎總被稱為 dcache。

一個 dentry(目錄項物件)是一筆位於 RAM 的小紀錄,把一個路徑元件(例如 sam 這樣的單一名字)與它解析到的 inode 配成一對,再加上一個指向其父 dentry 的指標。靠這些父指標串起來,眾多 dentry 形成一棵反映目錄結構的記憶體樹。要解析一條路徑,核心逐元件走訪,每一步先問 dcache:「在這個父目錄下,我已經有這個名字的 dentry 了嗎?」命中就完全避開磁碟。dcache 也快取否定結果:一個特殊的否定 dentry 記下某名字「不存在」,所以對缺檔的重複查找也很快。未使用的 dentry 放在 LRU 串列上,在記憶體壓力下被回收。

為何重要:dcache 是路徑操作在暖系統上感覺起來像瞬時的主因之一——它把重複的 O(深度) 磁碟走訪變成 RAM 速度的指標追逐。不過它純粹是效能快取:它從不持有權威的目錄資料,那住在磁碟上。當你更名或刪除檔案時,核心必須小心地更新或失效受影響的 dentry,好讓快取不會謊報哪些名字現在指向何處。

解析 /home/sam/notes: dcache 命中 '/' -> inode 2 dcache 命中 'home' -> inode 131073 dcache 未命中 'sam' -> 讀取目錄區塊,建立 dentry -> inode 262145 dcache 命中 'notes' -> inode 262200

每個路徑元件都透過 dcache 解析;只有未命中才會碰到磁碟。

常見的混淆:dentry 不是磁碟上的目錄項。磁碟上的目錄項(目錄資料裡的名字加 inode 號)才是真相來源;dentry 是核心由它建出來、快取於 RAM 的物件。否定 dentry 表示「已知這個名字不存在」,而這件事本身也被快取。

又稱
dcachedirectory entry cache目錄項快取