i-node

Overview

  • 每個 cylinder group 所能儲存及使用的 i-node 數量是固定的 → 可以創造的檔案總量是固定的 →可能會出現還有儲存空間但已沒有 i-node 的狀況
  • 檔案實際內容存在 data block,它們是分散在 disk 上的,所以 i-node 會記錄這些 data block 在 i-node 的哪裡
  • i-node 是一個我們如何識別一個檔案的方式,我們熟悉的 file name 僅是指向 i-node 的指標(我們可以創造 hard link 讓一個檔案有多個 file name)
  • directory 實際上便是儲存 i-node 到 file name 的 mapping → 所以我們在同一個 file system 移動檔案實際上只需要修改 directory file 的內容便可

When will i-node be released?

i-node 會有 link count,紀錄有多少 hard link 指向它,如果滿足以下條件,就可以釋放這個 i-node

  1. link count = 0
  2. 沒有 fd 正在開啟他 (i-node table 上沒有它)

Manage temporary file in process

當我們在 program 中需要用到 temp file 時,我們可以在 open 之後直接接 unlink,這樣 i-node 的 link count 就會是 0 ,但是因為我們還在 open 這個檔案,所以 i-node 還沒釋放掉,我們便可以在此檔案上自由操作,當程序結束後, fd 釋放,i-node 也就會自動釋放了

這樣可以避免當我們程式寫爛(segmentation fault 之類的)時,temporary file 還是可以被正確的釋放

Structure

lstat 回傳的 struct stat 便是這個地方紀錄的資訊

direct block

儲存 block pointer,每個指向一個 4KB 的 block

single/double/triple indirect pointer

有時 direct block pointer 會不夠,所以我們讓 indirect pointer 指向一個 block,而這個 block 只用來記錄 direct pointer

而 single/double/triple 的差別就是包了幾層 indirect pointer(如上圖)

indirect pointer 不會大幅增加讀取速度

當我們第一次讀取 indirect pointer 指向的 indirect/direct pointer,它就會被記錄在 buffer cache 裡面,所以之後我們要讀它就可以直接在 memory 讀取,不用進行 disk I/O