檔案系統實作

間接區塊(indirect block)

假設你的手機只能直接存十幾個聯絡人,但你保留一張卡片,上面寫著「去哪裡找一本裝滿更多號碼的筆記本」。那張卡片本身不放電話號碼——它放的是一個指向「裝著許多號碼之處」的指標。間接區塊正是檔案索引節點裡這種卡片:一個磁碟區塊,它不放檔案的資料,而是放著指向「放資料的區塊」的指標。

當檔案大到超過索引節點裡那少數幾個直接指標時,檔案系統會配置一個額外的區塊,整個填滿區塊位址,再把這個區塊的位址存進索引節點的單層間接指標。以 4 KB 區塊、4 位元組指標計,一個間接區塊可存 1024 個資料區塊位址——約 4 MB 的檔案。對更大的檔案,雙層間接區塊存的是指向「單層間接區塊」的指標(一個區塊的指標指向指標區塊,再指向資料),三層間接區塊則再加一層。你每往下一層,到達資料前就多一次磁碟讀取,因為你必須先取那個指標區塊,也許再取下一個,最後才取到資料區塊。

間接區塊就是那組齒輪,讓一個小而固定的索引節點得以描述龐大的檔案:你只為檔案中真正需要的部分,多花一點儲存與幾次讀取。誠實的代價是真實存在的,但通常被妥善隱藏:作業系統會把近期用過的間接區塊快取在記憶體裡,所以循序讀一個大檔案時,每個間接區塊只取一次,之後就在它後面串流出許多資料區塊。要避免的主要誤解,是以為間接區塊含有檔案內容——它含的是位址,是地圖,不是疆域。

一個 5 MB、用 4 KB 區塊的檔案約需 1280 個資料區塊。前 12 個由索引節點的直接指標到達;其餘約 1268 個列在一個單層間接區塊(容量 1024)裡,外加少數幾個溢出到雙層間接區塊。讀第 500 個區塊的步驟是:讀那個單層間接區塊,取第 500-12 = 488 個項目,再讀那個資料區塊。

間接區塊是一個裝滿位址的區塊,不是資料——它是指出檔案真正所在的地圖。

間接區塊存的是指標,絕不存檔案內容。每多一層間接,到達資料前就多一次磁碟讀取——這正是為什麼直接指標負責處理真實工作負載中佔多數的小檔案。

又称
pointer blocksingle/double/triple indirect block指標區塊