可用空間位元圖(free-space bitmap)
想像公寓大廳一整面信箱牆,每個都有一支小旗子:旗子立起代表這個信箱是空的、可用,旗子放下代表已被佔用。要找空信箱,你掃過那些旗子;要佔用一個,你把它的旗子放下。可用空間位元圖正是磁碟區塊的這面旗子牆——每個區塊一個位元,這個位元說明它「空閒」或「已用」。
具體來說,檔案系統維護一個位元陣列,磁碟區上每個區塊對應一個。慣例上 1 可能代表空閒、0 代表已用(各系統不同;每個檔案系統的慣例是固定的)。區塊編號 n 由第 n 個位元代表,所以要檢查區塊 1574 是否空閒,就是讀第 1574 個位元,要佔用它就是清除或設定那一個位元。位元圖有兩點很吸引人。第一,它精簡:每區塊一位元,意味著一顆用 4 KB 區塊的 1 TB 磁碟,只需約 32 MB 的位元圖,小到可以放在記憶體裡。第二,它讓「尋找一段連續的空閒區塊」既容易又快,因為你只要掃描一段連續為空閒的位元——這正是連續配置所需要的。許多 CPU 甚至有「找出一個字組中第一個被設定的位元」的指令,加速這個掃描。
位元圖是真實檔案系統中最常見的可用空間結構(例如 ext 就使用區塊位元圖與索引節點位元圖)。它誠實的弱點是:在非常大的磁碟區上,位元圖本身會很大,而在一顆幾乎全滿的磁碟上掃描最後幾個空閒區塊可能很慢。和所有可用空間中繼資料一樣,位元圖必須與實際的配置保持一致:一次只更新了資料卻沒更新位元圖(或相反)的當機,會讓檔案系統需要修復。
一個 16 區塊磁碟區的位元圖讀作 1100 1111 0011 1110,其中 1 = 空閒。區塊 2、3、8、9、15 是已用;其餘皆空閒。要配置兩個連續區塊,檔案系統掃描兩個相鄰的 1,找到區塊 4 與 5,再把第 4、5 個位元翻成 0。
每區塊一個位元:掃描空閒位元(尤其是連續區段)既快又精簡。
位元圖擅長低成本地找出連續的空閒區段,但在一個巨大、幾乎全滿的磁碟區上,尋找最後幾個空閒區塊可能很慢,而且整個位元圖必須與實際配置維持當機一致。