分配文件是一个非常大,而且无法访问的文件,负责跟踪宗卷中所有块的分配情况。
技术简介
分配文件设计为一个简单的位图形式,其中每一个位表示一个
数据块,如果对应的数据块被使用了(或者可能为一个坏块),那么这个位会被置位。分配文件的大小直接取决于宗卷大小和块大小,可以通过(宗卷大小/块大小)/8直接计算得到,其中宗卷包含了(宗卷大小/块大小)个数据块,而每一个数据块都对应一个位。
由于分配文件本身也是一个文件,因此可能会
碎片化。如果宗卷被扩大了,那么分配文件也会增长,因此实现了非常可扩展的方案。分配文件通常是连续的,而且包含在单独一个
extent中,因为分配文件是在创建文件系统时通过
mkfs程序创建的。此外,文件系统中分配块大小的动态变化也比较容易实现。
最新版本的HFS(在Lion中)引入了一个基于红黑树的分配器(#ifdef CONFIG_HFS_ALLOC_RBTREE)。这个分配器有一点类似于
XFS分配数据块的方法,当磁盘碎片化越来越严重时,提供更高效的基于红黑树的分配机制可以快速找到连续的数据块。有一个内核线程运行hfs_initialize_allocator()函数从宗卷的位图创建两个红黑树(一个用于元数据区域,另一个用于宗卷中剩下的其他部分)。注意,这些树创建在内存中,没有对应的磁盘存储形式,因此不需要对文件系统的磁盘结构进行修改。
HFS优势
与HFS使用一个称为“卷位图”的特殊区域存储分配块的信息不同,HFS+使用一个“分配文件”来表明卷中每个分配块是否已经分配给文件使用。分配文件是一个位图文件,这个位图文件中的每个bit对应该卷中的一个分配块,如果某个位进行了设置,则说明它所对应的分配块已经被文件系统中的文件所使用;如果某个位为空,说明还没有被使用。
HFS+卷使用分配文件有以下几点优势:
1.使用文件允许分配文件为其自身分配存储块,这种方式相对简单得多,因为这样卷就只有一种块类型——分配块。
HFS之所以复杂是因为它使用扇区来存储分配位图,用分配块来存储文件。
2.分配文件可以是不连续的,允许分配信息和用户数据交叉存取。许多现代的文件系统都采取这种方式以减少文件增大的过程中的磁头运动行程。
3.分配文件可以扩展。因为分配文件的可扩展性,所以很容易增加磁盘上的分配块的数量。这无论是对于想减小分配块的大小还是扩大整个磁盘的空间都是非常有用的。
4.分配文件的可收缩性。可以为不同大小的卷创建适当的镜像,回写至磁盘时,即便磁盘很大,也可以建立足够的分配文件数据;如果写入较小的磁盘,分配文件又可以收缩至适当的大小。
5.分配文件中的每个字节可以描述8个分配块的状态。文件中偏移X处的字节包
含分配块(x*8)至(x*8+7)这8个分配块的状态。在每个字节内部,最高位用来描述这个字节所描述的分配块中块号最低的分配块,最低位用来描述分配块号最高的分配块。
分配文件大小
(1)分配文件的大小依赖于卷中分配块的数量。也就是磁盘上扇区的数量和卷的分配块的大小(每分配块的扇区数)。例如:一个大小为1GB的磁盘上的卷,如果分配块大小为4KB,则需要大小为256Kb(32KB,即8个分配块)的分配文件。因此分配块文件本身也需要占用分配块,它总是占用整数个分配块。
(2)对于一个给定大小的卷,分配文件的大小可以大于这个卷所需要的最小分配文件字节数。位图中所有未使用的位必须全部设置为0。
(3)因为用32bit来描述分配文件的大小,它的上限可以达到512MB,这从根本上突破了HFS卷中8KB的限制。
(4)另外,因为整个卷都由分配块来记录是否已被分配使用,
卷头、备份卷头以及保留
扇区(开始的两个扇区和最后的一个扇区】必须被标记为“已分配”。
实际标记的已分配块数因分配块大小的不同而有所变化。例如:
1.如果分配块大小为512字节,则开始的三个分配块和最后的两个分配块被标记为已分配。
2.如果分配块大小为1024字节,则开始的两个分配块和最后的一个分配块被标记为已分配。
3.如果分配块的大小更大些,则只有开始的一个分配块和最后的一个分配块被标记为已分配。