檔案儲存空間的管理
前言
【要為新檔案分配儲存空間,系統必須以某種資料結構記住儲存空間的使用情況。此外,系統應提供對儲存空間進行分配和回收 的手段。(儲存空間分配的基本單位都是盤塊而非位元組)】因此,才有了【檔案儲存空間的管理】的概念。
【強調!檔案儲存空間管理的方法一定要和檔案外存分配方式區分!】
【檔案儲存空間管理是對沒有分配出去的空間進行管理】【檔案外存分配方式是對分配給檔案的空間進行分配的方法】
空閒表法
空閒表法屬於連續分配方式,它與記憶體的動態分配方式雷同,即系統也為外存上的所有空閒區建立一張空閒表,每個空閒區對應於一個空閒表項,其中包括表項序號、該空閒區的第一個盤塊號、該區的空閒盤塊數等資訊。再將所有空閒區按其起始盤塊號遞增的次序排列。
在記憶體分配上,雖然很少採用連續分配方式,然而在外存的管理中,由於這種分配方式具有較高的分配速度,可減少訪問磁碟的I/O 頻率,故它在諸多分配方式中仍佔有一席之地。
空閒連結串列法
①空閒盤塊鏈。這是將磁碟上的所有空閒空間,以盤塊為單位拉成一條鏈。
②空閒盤區鏈。這是將磁碟上的所有空閒盤區(每個盤區可包含若干個盤塊)拉成一條鏈。
位示圖法
位示圖是利用二進位制的一位來表示磁碟中一個盤塊的使用情況。當其值為“0”時,表示對應的盤塊空閒;為“1”時,表示已分配。有的系統把“0”作為盤塊已分配的標誌,把“1”作為空閒標誌。磁碟上的所有盤塊都有一個二進位制位與之對應,這樣,由所有盤塊所對應的位構成一個集合,稱為位示圖。通常可用m × n 個位數來構成位示圖,並使m × n等於磁碟的總塊數,如圖6-22 所示。
盤塊的分配
順序掃描位示圖,找到一個或一組空盤塊。 轉換為對應的盤塊號,公式:塊號為b,第i行,第j列,則b=n*(i-1)+j,其中n 為每行的位數。 修改位示圖。
盤塊的回收
已知盤塊號b,得對應的行列號,之後修改位示圖對應位的值。 i=(b-1) DIV n + 1,j=(b-1) MOD n + 1
成組連結法
空閒表法和空閒連結串列法都不適用於大型檔案系統,因為這會使空閒表或空閒連結串列太長。在UNIX 系統中採用的是成組連結法。
空閒盤塊的組織
①空閒盤塊號棧(只有一個,每一組的第一個盤塊的S.free、S.free(0)~S.free(99)記錄了下一組的盤塊總數N和下一組所有的盤塊號)用來存放當前可用的一組空閒盤塊的盤塊號(最多含100 個號),以及棧中尚有的空閒盤塊號數N。順便指出,N 還兼作棧頂指標用。例如,當N=100 時,它指向S.free(99)。由於棧是臨界資源,每次只允許一個程序去訪問,故系統為棧設定了一把鎖。圖6-23 左部示出了空閒盤塊號棧的結構。其中,S.free(0)是棧底,棧滿時的棧頂為S.free(99)。
②檔案區中的所有空閒盤塊被分成若干個組,比如,將每100 個盤塊作為一組。假定盤上共有10000 個盤塊,每塊大小為1 KB,其中第201~7999 號盤塊用於存放檔案,即作為檔案區,這樣,該區的最末一組盤塊號應為7901~7999;次末組為7801~7900……;第二組的盤塊號為301~400;第一組為201~300,如圖6-23右部所示。
③將每一組含有的盤塊總數N 和該組所有的盤塊號記入其前一組的第一個盤塊的S.free(0)~S.free(99)中。這樣,由各組的第一個盤塊可鏈成一條鏈。
④將第一組的盤塊總數和所有的盤塊號記入空閒盤塊號棧中,作為當前可供分配的空閒盤塊號。
⑤最末一組只有99 個盤塊,其盤塊號分別記入其前一組的S.free(1) ~S.free(99)中,而在S.free(0)中則存放“0”,作為空閒盤塊鏈的結束標誌。(注:最後一組的盤塊數應為99,不應是100,因為這是指可供使用的空閒盤塊,其編號應為(1~99),0號中放空閒盤塊鏈的結尾標誌。)
空閒盤塊的分配與回收
當系統要為使用者分配檔案所需的盤塊時,須呼叫盤塊分配過程來完成。該過程首先檢查空閒盤塊號棧是否上鎖,如未上鎖,便從棧頂取出一空閒盤塊號,將與之對應的盤塊分配給使用者,然後將棧頂指標下移一格。若該盤塊號已是棧底,即S.free(0),這是當前棧中最後一個可分配的盤塊號。由於在該盤塊號所對應的盤塊中記有下一組可用的盤塊號,因此,須呼叫磁碟讀過程,將棧底盤塊號所對應盤塊的內容讀入棧中,作為新的盤塊號棧的內容,並把原棧底對應的盤塊分配出去(其中的有用資料已讀入棧中)。然後,再分配一相應的緩衝區(作為該盤塊的緩衝區)。最後,把棧中的空閒盤塊數減1 並返回。
在系統回收空閒盤塊時,須呼叫盤塊回收過程進行回收。它是將回收盤塊的盤塊號記入空閒盤塊號棧的頂部,並執行空閒盤塊數加1 操作。當棧中空閒盤塊號數目已達100 時,表示棧已滿,便將現有棧中的100個盤塊號記入新回收的盤塊中,再將其盤塊號作為新棧底。
【例題】某小型檔案系統採用成組連結法管理磁碟空間,每個盤塊的大小為4KB。空閒盤塊號棧中最多可存放6個空閒盤塊號。棧底存放當前可用的空閒盤塊數。圖中給出了當前空閒盤塊號棧的內容以及後續兩組空閒盤塊號。請問: 1)該檔案系統當前有多少個空閒盤塊? 2)使用者A建立了一個新檔案A,大小為43KB。畫出為檔案A分配空間後,圖的變化結果。 3)之後使用者B刪除檔案B,檔案B佔用的盤塊號依次為51、52、53、54、55,畫出系統回收檔案B佔用的空間後的進一步變化結果。
解答:
1)14
2)
3)