
如果這個問題在其他地方有完全相同的重複,請原諒,但到目前為止,我在 SE 或其他網站上找到的所有答案一般都沒有具體回答這個問題。我正在大學學習作業系統課程,因此我對檔案系統總體來說還很陌生。
據我所知,在大多數檔案系統中,都有一個包含檔案目錄條目的根目錄。這些條目包含從檔案名稱到索引節點號碼的映射,且長度大小可變。
根據這個答案,我猜這些條目是以線性方式儲存的,如下所示:
我可以完全理解 inode 是什麼以及它們如何使用其目錄 (TOC) 條目映射到實體磁碟上檔案的資料區塊編號。
然而,我的問題是:子目錄文件目錄條目如何以及在哪裡儲存?
我相信它們要么存儲在與根目錄相同的位置,但有一定的偏移量。但是,我無法想像如何從 inode 檢索此偏移量。
因此,我有一種感覺,子目錄的目錄項目實際上是儲存在磁碟的資料區域中,而不是與根目錄的項目一起儲存。
因此,如果是這種情況,從一個目錄遍歷到另一個目錄需要磁碟從看似任意的位置讀取,這對我來說似乎有點低效。
儘管如此,我想簡單地澄清我對子目錄的文件目錄條目的位置的誤解。
非常感謝您的幫忙。
答案1
目錄通常作為檔案實作。它們有一個索引節點和一個資料區域,但當然通常透過特殊的系統呼叫來存取(至少寫入)。有些系統允許閱讀具有通常read(2)
系統呼叫的目錄(Linux 沒有,我上次檢查時 FreeBSD 有)。目錄檔案的資料區域包含目錄條目。在 上ext4
,根目錄也有一個 inode,它固定為 inode 號 2(嘗試ls -lid /
)。
讓目錄像檔案一樣,可以輕鬆地為目錄條目等分配空間,因為為檔案指派區塊的函數必須始終存在。此外,由於它們根據需要使用相同的資料區塊,因此無需事先在檔案資料和目錄清單之間分配空間。
目錄條目儲存方式的內部結構因檔案系統而異,並且例如在ext2
和之間演變ext4
。現代系統使用樹而不是線性列表來加快查找速度。看這裡。就連尊貴的人FAT 檔案系統將目錄儲存為文件,但至少在較舊的 FAT 中,根目錄是特殊的。 (FAT 中目錄項目的結構當然與 Unix 檔案系統不同。)
因此,如果是這種情況,從一個目錄遍歷到另一個目錄需要磁碟從看似任意的位置讀取,這對我來說似乎有點低效。
是的。但經常存取的目錄條目(或底層資料塊)很可能被快取在現代作業系統中。
集中保存所有目錄的內容需要預先分配很大的區域,並且仍然需要在目錄資料區域內進行磁碟查找。
答案2
常見的解決方案是根目錄中的某些 inode 指向的條目也是目錄。在許多方面,它們就像檔案一樣,但檔案類型指示檔案系統將它們解釋為目錄。
(在非常古老的教程中,例如原始的 Unix,你甚至會被告知你cat
也可以有一個目錄。但現在情況通常不再是這樣了。)
換句話說,每個目錄都是一個簡單的 inode 指標線性列表。其中一些指向目錄樹(檔案)中的葉節點,有些則指向內部節點(另一個目錄)。根目錄唯一的特殊之處在於它是它自己的父目錄,而樹外部有一些東西告訴系統從這裡開始遍歷樹。