当前位置:嗨网首页>书籍在线阅读

11-ext2中的i节点和数据块指针

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

ext2中的i节点和数据块指针

类似于大多数UNIX文件系统,ext2文件系统在存储文件时,数据块不一定连续,甚至不一定按顺序存放(尽管ext2会尝试将数据块彼此靠近存储)。为了定位文件数据块,内核在i节点内维护有一组指针。图14-2所示为在ext2文件系统上完成上述任务的情况。

304.png

图14-2:ext2文件系统中文件的文件块结构

无需连续存储文件块,使得文件系统对磁盘空间的利用更为高效。特别是,还能降低空闲磁盘空间的碎片化程度,即因众多不连续空闲磁盘碎片(因其空间太小而无法使用)而导致的磁盘空间浪费。换言之,对空闲磁盘空间的高效利用,是以已分配磁盘空间中文件的碎片化为代价的。

在ext2中,每个i节点包含15个指针。其中的前12个指针(图14-2中编号为0~11的指针)指向文件前12个块在文件系统中的位置。接下来,是一个指向指针块的指针,提供了文件的第 13个以及后续数据块的位置。指针块中指针的数量取决于文件系统中块的大小。每个指针需占用4字节,因此指针的数量可能在256(块容量为1024字节)~1024(块容量为4096字节)之间。这样就考虑了大型文件的情况。即便是对于巨型文件,第14个指针(图中编号为13)是一个双重间接指针——指向指针块,其块中指针进而指向指针块,此块中指针最终才指向文件的数据块。只要有体量巨大的文件,就会随之产生更深一层的递进:图中i节点的最后一个指针属于三重间接指针。

这一貌似复杂的系统,其设计意图是为了满足多重需求。首先,该系统在维持i节点结构大小固定的同时,支持任意大小的文件。其次,文件系统既可以以不连续方式来存储文件块,又可通过lseek()随机访问文件,而内核只需计算所要遵循的指针。最后,对于在大多数系统中占绝对多数的小文件而言,这种设计满足了对文件数据块的快速访问:通过i节点的直接指针访问,一击必中。

试举一例,笔者对一个包含约150 000个文件的系统进行了度量。其中30%多的文件大小在 1000 字节以下,80%的文件占用了10 000字节或者更少的空间。假定块的大小为1024字节,只要使用12个直接指针便能引用大小为10000字节及以下的文件,可访问总计12288字节的块。若块大小为4096字节,则该上限可达49152字节(系统中95%的文件大小都处于该容量限制之下)。

上述设计同样考虑了巨型文件的处理,对于大小为4096字节的块而言,理论上,文件大小可略高于1024×1024×1024×4096字节,或4TB(4096 GB)。(之所以说“略高于”,是因为指针指向块的方式可以为直接、间接或双重间接。与三重间接指针所指向的范围相比,多出来的那些空间实在是微不足道。)

该设计的另一优点在于文件可以有黑洞(如4.7节所述)。文件系统只需将i节点和间接指针块中的相应指针打上标记(值0),表明这些指针并未指向实际的磁盘块即可,而无需为文件黑洞分配空字节数据块。