空闲空间管理

因为磁盘空间是有限的,所以我们会需要将被删除的文件的空间用于新文件。为了记录空闲磁盘空间,系统需要去维护一个空闲空间链表(free-space list)。空闲空间链表记录了所有空闲的磁盘空间,也就是未分配给文件或目录的空间

当我们去创建一个文件的时候,搜索空闲空间链表以得到所需要的空间,并且将其分配新文件。这些空间会从空闲空间链表中删除。当删除文件的时候,其磁盘空间会增加到空闲空间表上

通常来说,空闲空间表实现为位图(bit map)或位向量(bit vector),每块都用一位来表示,如果一块为空闲,那么其位为1,如果一块已分配,那么其位为0

就比如说其块2、3、4、5、6为空闲,总共有8块,空闲空间位图如下所示

00111110

利用这种方法的优点就是我们可以查找磁盘上的第一个空闲块和n个连续空闲块时相对简单和高效,很多计算机都有位操作指令,能有效的实现这一目的,比如从80386开始的intel系列和从68020开始的Motorola系列都有能返回一个字中第一个值为1的位的偏移指令

如果在使用位图的系统上找到第一个空块来分配磁盘空间的一种技术就是按顺序检查位图的每个字以检查其是否为0,因为一个值为0的字表示其对应的所有块都已分配,然后我们再对第一个值为非0的字进行搜索值为1的位偏移,这个偏移对应着第一个空闲块,该块号码的计算如下所示

(值为0的字数)*(一个字的位数)+第一个值为1的位的偏移

上面提到了位偏移指令,其实就是利用硬件的特性简化了软件的功能

除非整个位向量都能保存在内存当中并且时而的写入到磁盘当中用于恢复的需要,否则位向量的效率就不高。对于小磁盘,完全保存在内存当中是有可能的,但是大的磁盘可能不太可能

空闲空间管理的另一种方法就是将所有空闲磁盘块用链表连接起来,并且将指向第一空闲块的指针保存在磁盘的特殊位置,同时也缓存在内存当中,每一块都包含下一个空闲磁盘块的指针

采用链表的方法有个弊端就是如果需要遍历整个表的时候,需要读入每一块,这需要大量的I/O时间,不过好在遍历整个表不是一个经常的操作,通常操作系统只需要简单地将第一个空闲块分配给一个文件就可以了

对于空闲链表的一个改进就是将n个空闲块的地址存在第一个空闲块中,这样的话大量的空闲块就可以很快的找到了

还有一种方法就是计数的方法,这种方法就是利用了这样的一个事实就是,通常,有多个连续块需要同时分配或释放,尤其是在使用连续分配和采用簇的时候更是如此,因此,不是记录n个空闲块的地址,而是可以去记录第一块的地址和紧跟着第一块的连续的空闲块的数量n

这样的话空闲表的每个条目包括磁盘地址和数量,虽然每个条目会比原来需要更多的空间,但是表的总长度会更短,这是因为连续块的数量常常大于1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值