详解文件存储空间管理中的位示图法

何为位示图法?

在给文件分配空间时,是以磁盘的盘块为基本单位分配的,必须记录磁盘可用于分配的盘块(即空闲盘块),以及提供磁盘分配和回收的手段。
文件存储空间管理就是用来完成上述功能的,位示图法文件存储空间管理的几种方法之一。


位示图法简介

利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“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



以上为个人理解,可能有偏颇疏漏,欢迎交流指正。

  • 139
    点赞
  • 450
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
空闲表位示图和成组链接均为文件存储管理的常用算。 下面是它们的基本实现方: 1. 空闲表 空闲表是一种常见的文件存储管理,它将存储空间分成若干个固定大小的块,每个块都有一个标识符来表示其状态(已分配或未分配)。同时,系统会维护一个空闲块的列表,用于记录所有未分配的块。 具体实现方如下: (1) 初始化时,将整个存储空间划分成大小相等的块,并将所有块标记为未分配状态。 (2) 当需要分配一个文件时,遍历空闲块列表,找到一个足够大的未分配块,并将其标记为已分配状态。 (3) 当文件不再需要占用空间时,将其对应的块标记为未分配状态,并将其添加到空闲块列表。 2. 位示图 位示图是一种基于位示图文件存储管理,它将存储空间分成若干个固定大小的块,并使用一个位示图来记录每个块的状态(已分配或未分配)。位示图每一个位都对应一个块,如果该位为1,则表示对应块已分配;如果该位为0,则表示对应块未分配。 具体实现方如下: (1) 初始化时,将整个存储空间划分成大小相等的块,并将位示图的所有位初始化为0。 (2) 当需要分配一个文件时,遍历位示图,找到一个连续的未分配块,并将它们对应的位设置为1。 (3) 当文件不再需要占用空间时,将其对应的块的位设置为0。 3. 成组链接 成组链接是一种基于链表的文件存储管理,它将存储空间划分成若干个大小相等的块(称为组),每个组的大小为若干个块,且每个组都有一个组头,用于记录该组未分配的块的数量和位置。同时,系统会维护一个空闲块的链表,用于记录所有未分配的块。 具体实现方如下: (1) 初始化时,将整个存储空间划分成大小相等的块,将它们分成若干组,并将空闲块链表初始化为整个存储空间的第一个块。 (2) 当需要分配一个文件时,遍历空闲块链表,找到一个足够大的未分配块,并将其分配给文件。如果需要分配的块不足以组成一整个组,则将其放回空闲块链表。 (3) 当文件不再需要占用空间时,将其对应的块返回到空闲块链表,并更新其所在组的组头信息。如果该组所有块都已经空闲,则将该组从空闲块链表移除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值