空闲空间管理主要涉及对硬盘或其他辅助存储设备上可用存储空间的管理。为了重用删除文件后释放的空间,我们需要维护一个空闲空间列表。这个空闲空间列表可以通过以下几种主要方式实现:
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250912133343247028/Freespacemanagement.webp">Freespacemanagement空闲空间管理
- 位图或位向量
- 链表
- 边界标记
- 空闲列表
位图或位向量
在这种方法中,我们使用位图或位向量,它实际上是一系列或一组位的集合,其中每个位对应一个磁盘块。每个位可以取两个值:0 和 1:
- 0 表示该块是空闲的,1 表示该块已分配。
- 图 1 中给定的磁盘块实例可以用一个 16 位的位图表示为:1111000111111001。
!Bitmap位图
优点:
- 简单易懂。
- 查找第一个空闲块非常高效。这需要在位图中扫描字(一组 8 位)以寻找非零字。(值为 0 的字意味着所有位都为 0)。然后,通过在非零字中扫描第一个 1 位,即可找到第一个空闲块。
缺点:
- 为了查找一个空闲块,操作系统需要遍历所有块,这非常耗时。
- 随着磁盘大小的增加,该方法的效率会降低。
链表
在这种方法中,我们将空闲块链接在一起形成一个列表。每个空闲块都存储着下一个空闲块的地址。随着块的分配和释放,该列表是动态维护的。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250912133544816779/FreeList.webp">FreeList链表
> 注意: 空闲空间列表的头指针指向块 5,块 5 指向下一个空闲块块 6,依此类推。最后一个空闲块将包含一个空指针,表示空闲列表的结束。
优点:
- 使用这种方法可以高效地利用全部可用空间。
- 链表中的动态分配很容易,因此可以根据需求动态添加空间。
缺点:
- 当链表的大小增加时,维护指针的复杂性也会随之增加。
- 在遍历内存的每个块时,这种方法效率不高。
- 遍历空闲空间列表需要进行 I/O 操作。
边界标记
在这种方法中,每个块都包含一个边界标记,用于指示其大小以及它是处于空闲还是占用状态。在释放空间期间,我们会合并相邻的空闲块以减少碎片。
优点:
- 在内存管理系统中非常有用。
- 简化了相邻空闲块的合并操作。
缺点:
- 存储标记信息会有轻微的开销。
- 比位图或链表更复杂。
空闲列表
在这种方法中,我们在一个列表(数组或链表)中维护空闲块。空闲列表中的每个条目直接指向磁盘上的一个空闲块。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250908184842066997/diskblock.webp">diskblock空闲列表
优点:
- 分配速度快,因为预先就知道了空闲块的位置。
- 易于遍历和维护。
缺点:
- 需要额外的内存来存储该列表。
- 随着时间的推移,可能会产生碎片。