詳解文件存儲空間管理中的位示圖法


何為位示圖法?

在給文件分配空間時,是以磁盤的盤塊為基本單位分配的,必須記錄磁盤可用於分配的盤塊(即空閑盤塊),以及提供磁盤分配和回收的手段。
文件存儲空間管理就是用來完成上述功能的,位示圖法文件存儲空間管理的幾種方法之一。


位示圖簡介

利用二進制的一位來表示磁盤中的一個盤塊的使用情況。當其值為“0”時,表示對應的盤塊空閑;為“1”時,表示已經分配(或者把"0"作為盤塊已分配的標記,把“1”作為空閑標志)。磁盤上的所有盤塊都有一個二進制位與之對應,這樣,由所有盤塊所對應的位構成一個集合,稱為位示圖。通常可用m*n個位數來構成m行n列的位示圖,並使m*n等於磁盤的總塊數。


盤塊的分配過程

1) 順序掃描位示圖,找到一個或一組代表空閑盤塊的二進制位(如果是0代表空閑盤塊就找0,如果1代表空閑盤塊就找1).

2) 將所找到的一個或一組二進制位的行號和列號轉換成相應的盤塊號。
(轉換公式在下面統一說)

3) 將位示圖對應的一個或一組二進制位修改為代表已分配盤塊的二進制位(如果1代表已分配,就修改為1,如果0代表已分配,就修改為0)。


盤塊的回收過程

1) 將要回收的盤塊號轉換成對應的行號和列號。
(轉換公式在下面統一說)

2) 修改位示圖,令對應的二進制位為代表空閑盤塊的二進制位(如果0代表空閑盤塊就修改為0,如果1代表空閑盤塊就修改為1。)


分配和回收時的轉換公式

分四種情況
1.行列號從0開始,盤塊號從0開始
2.行列號從0開始,盤塊號從1開始
3.行列號從1開始,盤塊號從0開始
4.行列號從1開始,盤塊號從1開始

下面一一敘述:


ps: d i v div div為整除, m o d mod mod為取余
ps:位示圖每個位可以取0或1,下面表格中的內容不代表位示圖的取值,而是代表對應位的位置編號,即行號列號盤塊號。每個單元格內容的格式如下:

盤塊號( 行號,列號)

ps:為了方便說明,假設下面的位示圖每行都只有4個位


情況1 ) 行列號從0開始,盤塊號從0開始

如圖:

^_^ 第0列 第1列 第2列 第3列
第0行 0(0,0) 1(0,1) 2(0,2) 3(0,3)
第1行 4(1,0) 5(1,1) 6(1,2) 7(1,3)
第2行 8(2,0) 9(2,1) 10(2,2) 11(2,3)
第…行

此種情況最好計算,類似於二維數組的行列下標與元素位置之間的轉換

分配時,行列號轉換為盤塊號
盤塊號 = = = 行號 ∗ * 一行位數 + + + 列號

回收時,盤塊號轉換為行列號:
行號 = = =盤塊號 d i v div div 一行位數
列號 = = =盤塊號 m o d mod mod 一行位數

情況2) 行列號從0開始,盤塊號從1開始

如圖:

^_^ 第0列 第1列 第2列 第3列
第0行 1(0,0) 2(0,1) 3(0,2) 4(0,3)
第1行 5(1,0) 6(1,1) 7(1,2) 8(1,3)
第2行 9(2,0) 10(2,1) 11(2,2) 12(2,3)
第…行

相對於第一種情況,盤塊號多了1,所以:
分配時,相對於第一種情況,計算后盤塊號再加一
盤塊號 = = = 行號 ∗ * 一行位數 + + + 列號 + + + 1

回收時,相對於第一種情況,計算前盤塊號先減一
行號 = = =(盤塊號 − - 1) d i v div div 一行位數
列號 = = =(盤塊號 − - 1) m o d mod mod 一行位數

情況3) 行列號從1開始,盤塊號從0開始

如圖:

^_^ 第1列 第2列 第3列 第4列
第1行 0(1,1) 1(1,2) 2(1,3) 3(1,4)
第2行 4(2,1) 5(2,2) 6(2,3) 7(2,4)
第3行 8(3,1) 9(3,2) 10(3,3) 11(3,4)
第…行

相對於第一種情況,行列號多了1,所以:
分配時,相對於第一種情況,計算前行列號先減一
盤塊號 = = = (行號 − - 1) ∗ * 一行位數 + + + 列號 − - 1

回收時,相對於第一種情況,計算后行列號再加一
行號 = = =盤塊號 d i v div div 一行位數 + + + 1
列號 = = =盤塊號 m o d mod mod 一行位數 + + + 1

情況4) 行列號從1開始,盤塊號從1開始

如圖:

^_^ 第1列 第2列 第3列 第4列
第1行 1(1,1) 2(1,2) 3(1,3) 4(1,4)
第2行 5(2,1) 6(2,2) 7(2,3) 8(2,4)
第3行 9(3,1) 10(3,2) 11(3,3) 12(3,4)
第…行

相對於第一種情況,盤塊號、行列號都多了1,所以:
分配時,相對於第一種情況,計算前行列號先減一,計算后盤塊號再加一
盤塊號 = = = (行號 − - 1) ∗ * 一行位數 + + + (列號 − - 1) + + + 1
即:
盤塊號 = = = (行號 − - 1) ∗ * 一行位數 + + + 列號

回收時,相對於第一種情況,計算前盤塊號先減一,計算后行列號再加一
行號 = = =(盤塊號 − - 1) d i v div div 一行位數 + + + 1
列號 = = =(盤塊號 − - 1) m o d mod mod 一行位數 + + + 1



以上為個人理解,可能有偏頗疏漏,歡迎交流指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM