為什麼在 inode 中使用間接指針不會產生相同數量的空間?
我在多級分頁中也遇到了同樣的困惑。對於 inode,我們有指向數據塊的直接和間接指針。但是,對於小文件,我們更喜歡使用間接指針,因為它們可以為我們的目的儲存更多的指針。
但是,為什麼在一級上按順序儲存直接指針會更消耗數據,而如果我們使用間接指針則更少呢?當然,指針都必須存在於文件系統中的某個位置,並且會產生相同數量的空間,不是嗎?這個額外的空間是從哪裡來的?
這是我認為的一個例子:如果我有 10 個直接指針和 2 個間接指針,每個指針分別導致 128 和 128^2 指針,那麼消耗的總大小是否與 10 + 128 + 128^2 相同直接指針?如果沒有,如何節省空間?
作為一個附帶問題,inode 的典型大小是多少,為什麼 inode 的大小會有所不同?
inode 級別的原始層次結構大致如下:
您可以直接在 inode 中儲存一個或幾個塊號。這意味著您為 inode 多使用了幾個字節,但對於小文件,您不必分配一個完整的塊,該塊大部分是空的。
下一級是一個間接:分配一個塊來儲存塊指針。僅此間接塊的地址儲存在 inode 中。這不會以某種方式使用“更少的空間”,並且大多數文件系統,甚至是早期的文件系統,都是這樣工作的(在 inode/filename 附近有一個指針,它指向一個塊,該塊儲存文件的塊號)。
但是當這個塊中的空間用完時你會怎麼做?您必須分配另一個塊,但是您將對該塊的引用儲存在哪裡?您可以將這些引用添加到 inode,但要儲存更大的文件,inode 會變大。並且您需要小的 inode,因此盡可能多的 inode 可以放入一個塊中(更少的磁碟訪問以讀取更多的 inode)。
所以你使用了兩級間接塊:你只需添加一個指向 inode 的指針,然後你有一個完整的塊來儲存指向間接塊的指針,間接塊儲存文件本身的塊地址。
依此類推,您可以添加更高級別的間接塊,或在某個階段停止,直到您達到具有所需結構的文件的最大大小。
因此,重點不是“總共佔用更少的空間”,而是“使用一種有效地使用塊的方案來實現文件的預期分佈,即許多小文件、一些大文件和很少的大文件”。
另一方面,頁表的工作方式非常不同。
編輯
要回答評論中的問題:
數據塊的大小是固定的(最初是 512 字節,IIRC),是底層硬碟塊大小的倍數。所以數據塊大小不能“減少”。
正如我在上面試圖描述的那樣,讓 inode 不佔用太多空間的全部意義在於使inode 訪問更快(或者,使記憶體 inode 使用更少的記憶體 - 那時,當帶有 inode 的 unix 文件系統被發明時,電腦的記憶體比今天少得多)*。*這不是以某種方式節省空間。正如您自己所說,所有東西都必須儲存在某個地方,如果它不使用位置 X 的空間,它將使用位置 Y 的空間。
僅僅給inode添加可變數量的塊指針是不切實際的,因為inode必須佔用固定數量的空間——你想用inode號來計算塊地址和inode資訊所在塊內的偏移量儲存。如果每個 inode 的大小不同,您就無法做到這一點。所以必須有某種形式的間接性。
頁表的工作方式不同,因為硬體實現它們的方式不同——就是這樣。層次結構具有固定的深度,始終相同(儘管有時可配置。雖然從磁碟讀取塊很慢,但這對於頁表來說並不重要。所以設計問題完全不同。