文章目录
何为位示图法?
在给文件分配空间时,是以磁盘的盘块为基本单位分配的,必须记录磁盘可用于分配的盘块(即空闲盘块),以及提供磁盘分配和回收的手段。
文件存储空间管理就是用来完成上述功能的,位示图法文件存储空间管理的几种方法之一。
位示图法简介
利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“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
以上为个人理解,可能有偏颇疏漏,欢迎交流指正。