8.2 文件存储空间的管理
文件存储空间的管理是文件系统设计中的一个核心问题,它直接影响到文件系统的性能和存储效率。常用的管理方法包括空闲表法、空闲链表法和位示图法等。
8.2.1 空闲表法和空闲链表法
空闲表法
空闲表法利用一张表记录外存中所有空闲区的信息,包括空闲区的起始盘块号和空闲盘块数等。系统通过检索空闲表来分配和回收存储空间。这种方法类似于内存的动态分配方式,适用于需要连续存储空间的文件系统。
空闲链表法
空闲链表法将所有空闲盘块或盘区链接成一条链表。根据链表的构成元素不同,分为空闲盘块链和空闲盘区链两种方式。
- 空闲盘块链:以单个盘块为单位,每个盘块都有指向下一个空闲盘块的指针。这种方法简单,但对于分配多个连续盘块的文件,效率较低。
- 空闲盘区链:以多个连续盘块组成的盘区为单位,每个盘区有指向下一个空闲盘区的指针和表示本盘区大小的信息。这种方法更适用于大文件的存储,可以减少链表的长度,提高分配效率。
8.2.2 位示图法
位示图法使用二进制位来表示每个盘块的状态(已分配或空闲)。每个盘块对应位示图中的一位,盘块被分配时该位设置为1,回收时设置为0。这种方法可以快速地找到空闲盘块,尤其适用于需要频繁分配和回收小文件的场景。
盘块的分配与回收
- 分配:扫描位示图找到连续的“0”位,将其转换为对应的盘块号,并将这些位设置为“1”表示分配。
- 回收:将文件占用的盘块对应的位示图中的位重置为“0”表示回收。
位示图法的优点在于其简洁性和高效性,尤其是在内存中维护位示图时,可以显著减少磁盘I/O操作。但是,对于寻找连续的空闲盘块,特别是在磁盘使用率高的情况下,可能需要较长的扫描时间。
综合分析
各种文件存储空间的管理方法各有优缺点,实际应用中需要根据文件系统的具体需求和存储设备的特性来选择合适的管理策略。例如,位示图法由于其高效和简洁,被广泛应用于现代文件系统中。而空闲链表法和空闲表法则可能更适用于对连续存储空间有特殊要求的场景。
8.2.3 成组链接法
成组链接法是一种用于大型文件系统的空闲盘块管理方法,结合了空闲表法和空闲链表法的优点,同时避免了两种方法存在的空闲表或链表过长的问题。
1. 空闲盘块的组织
空闲盘块号栈
系统维护一个空闲盘块号栈,用于存放当前可用的一组空闲盘块号,最多包含100个号,以及栈中剩余的空闲盘块数N,同时N也作为栈顶指针使用。为确保并发访问控制,设置一把锁来管理对栈的访问。
文件区的组织
文件区内的所有空闲盘块被分成若干组,每组包含100个盘块。文件区的每组空闲盘块通过在每组的第一个盘块中记录下一组的盘块总数及所有盘块号来形成链表,使得各组的第一个盘块形成一条链。
空闲盘块号栈的填充
将第一组的盘块总数和所有盘块号填入空闲盘块号栈中,作为当前可供分配的空闲盘块号。最末一组由于只有99个可用盘块,其盘块号填入其前一组的指定位置,最末位填入“0”作为链的结束标志。
2. 空闲盘块的分配与回收
分配
在分配盘块时,检查空闲盘块号栈是否上锁,未上锁则从栈顶取出一个空闲盘块号分配给用户,并下移栈顶指针。若取出的盘块号是栈底,即栈中最后一个可分配的盘块号,需将此盘块对应的下一组可用盘块号读入栈中作为新的盘块号栈内容,并将原栈底盘块分配出去。
回收
在回收盘块时,将回收的盘块号记入空闲盘块号栈顶部,并增加空闲盘块数。当栈满时,即空闲盘块数达到100,将栈中的100个盘块号记入新回收的盘块中,再将其盘块号作为新的栈底。
成组链接法通过将空闲盘块分组管理,既减少了管理空间的开销,又提高了空闲盘块分配和回收的效率,特别适用于大型文件系统的空闲盘块管理。