如果这个问题在其他地方有完全相同的重复,请原谅,但到目前为止,我在 SE 或其他网站上找到的所有答案一般都没有具体回答这个问题。我正在大学学习操作系统课程,因此我对文件系统总体来说还很陌生。
据我所知,在大多数文件系统中,都有一个包含文件目录条目的根目录。这些条目包含从文件名到索引节点号的映射,并且长度大小可变。
根据这个答案,我猜这些条目是以线性方式存储的,如下所示:
我可以完全理解 inode 是什么以及它们如何使用其目录 (TOC) 条目映射到物理磁盘上文件的数据块编号。
然而,我的问题是:子目录文件目录条目如何以及在哪里存储?
我相信它们要么存储在与根目录相同的位置,但有一定的偏移量。但是,我无法想象如何从 inode 检索此偏移量。
因此,我有一种感觉,子目录的目录项实际上存储在磁盘的数据区域中,而不是与根目录的项一起存储。
因此,如果是这种情况,从一个目录遍历到另一个目录需要磁盘从看似任意的位置读取,这对我来说似乎有点低效。
尽管如此,我想简单地澄清我对子目录的文件目录条目的位置的误解。
非常感谢您的帮助。
答案1
目录通常作为文件实现。它们有一个索引节点和一个数据区域,但当然通常通过特殊的系统调用来访问(至少写入)。有些系统允许阅读具有通常read(2)
系统调用的目录(Linux 没有,我上次检查时 FreeBSD 有)。目录文件的数据区域包含目录条目。在 上ext4
,根目录也有一个 inode,它固定为 inode 号 2(尝试ls -lid /
)。
让目录像文件一样,可以轻松地为目录条目等分配空间,因为为文件分配块的函数必须始终存在。此外,由于它们根据需要使用相同的数据块,因此无需事先在文件数据和目录列表之间分配空间。
目录条目存储方式的内部结构因文件系统而异,并且例如在ext2
和之间演变ext4
。现代系统使用树而不是线性列表来加快查找速度。看这里。就连尊贵的人FAT 文件系统将目录存储为文件,但至少在较旧的 FAT 中,根目录是特殊的。 (FAT 中目录项的结构当然与 Unix 文件系统不同。)
因此,如果是这种情况,从一个目录遍历到另一个目录需要磁盘从看似任意的位置读取,这对我来说似乎有点低效。
是的。但经常访问的目录条目(或底层数据块)很可能被缓存在现代操作系统中。
集中保存所有目录的内容需要预先分配很大的区域,并且仍然需要在目录数据区域内进行磁盘查找。
答案2
常见的解决方案是根目录中的某些 inode 指向的条目也是目录。在许多方面,它们就像文件一样,但文件类型指示文件系统将它们解释为目录。
(在非常古老的教程中,比如原始的 Unix,你甚至会被告知你cat
也可以有一个目录。这通常不再是真的。)
换句话说,每个目录都是一个简单的 inode 指针线性列表。其中一些指向目录树(文件)中的叶节点,另一些则指向内部节点(另一个目录)。根目录唯一的特殊之处在于它是它自己的父目录,并且树外部有一些东西告诉系统从这里开始遍历树。