空闲空间管理
空闲表法
文件的存储是针对已经被占用的数据块的组织和管理,如果要保存一个数据块,应该放在硬盘上的哪个位置呢?如果将所有的块扫描一遍寻找一个空闲空间,这种方式效率太低了,所以针对磁盘的空闲空间也要引入管理的机制。
空闲表法就是为所有空闲空间建立一张表,表内容包括空闲区的第一个块号和该空闲区的块个数。注意,这个方式是连续分配的。
| 序号 | 第一个空闲块号 | 空闲块个数 |
|---|---|---|
| 1 | 2 | 3 |
| 2 | 8 | 3 |
| 3 | 13 | 2 |
| 4 | … | … |
当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。当用户撤销一个文件时,系统回收文件空间。这时,也需顺序扫描空闲表,寻找一个空闲表条目并将释放空间的第一个物理块号及它占用的块数填到这个条目中。
这种方法仅当有少量的空闲区时才有较好的效果,因为如果存储空间中有着大量的小的空闲区,则空闲表变得很大,这样查询效率会很低。另外,这种分配技术适用于建立连续文件。
空闲链表法
除了空闲表,也可以使用链表的方式来管理空闲空间,每一个空闲块里有一个指针指向下一个空闲块,这样也能很方便的找到空闲块并管理起来。当创建文件需要一块或几块时,就从链头上依次取下一块或几块。反之,当回收空间时,把这些空闲块依次接到链头上。
这种技术只要在主存中保存一个指针,令它指向第一个空闲块。其特点是简单,但不能随机访问,工作效率低,因为每当在链上查找或移动空闲块时可能需要做多次I/O操作,同时数据块的指针消耗了一定的存储空间。
空闲表法和空闲链表法在空闲区或空闲块很多的大型文件系统中,可能因为表或链表太大而效率较低。
位图法(Bit Table)
位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当值为0时,表示对应的盘块空闲,值为1时,表示对应的盘块已分配。许多Linux文件系统采用位图的方式来管理空闲空间。
一块磁盘,三种空闲空间地图
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
知识测验
用位图分配并回收磁盘块
约定0为空闲、1为已分配。从低块号开始扫描,分配四个块,再将其回收;写出选中的块、分配后位图和剩余空闲数。
用Python实现allocate(bitmap, count),可使用分散块;空间不足返回None,不改变任何位。假设位图只含0/1,count为正整数。另计算1 GiB磁盘、4 KiB块大小需要的位图空间(GiB = 2³⁰字节,KiB = 2¹⁰字节)。