如果这个问题在其他地方有确切的重复,请原谅,但是到目前为止,我在SE或其他站点上找到的所有答案一般都没有专门回答这个问题。我正在上大学的一门操作系统课程,因此,我对文件系统总体而言还是个新手。
我了解在大多数文件系统中,都有一个包含文件目录条目的根目录。这些条目包含从文件名到索引节点号的映射,并且长度可变。
根据这个答案,我猜这些条目是以线性方式存储的,如下所示:
通过使用目录(TOC)条目,我可以完全理解什么是inode,以及它们如何映射到物理磁盘上文件的数据块编号。
但是,我的问题是:子目录文件目录条目的存储方式和位置?
我相信它们或者存储在与根目录相同的位置,但有一些偏移。但是,我无法想象如何从inode检索此偏移量。
因此,我感到子目录的目录项实际上存储在磁盘的数据区域中,而不是与根目录的项一起存储。
因此,如果是这种情况,则从一个目录遍历到另一个目录需要磁盘从看似任意的位置读取,这对我来说似乎效率不高。
不过,我只想消除我对子目录的文件目录项位置的误解。
非常感谢您的帮助。
目录通常以文件形式实现。它们有一个索引节点和一个数据区,但是当然通常通常由特殊的系统调用来访问(至少写入)。有些系统允许使用通常的系统调用来读取目录read(2)
(Linux不允许,FreeBSD在我上次检查时允许)。然后,目录文件的数据区域包含目录条目。在上ext4
,根目录还有一个索引节点,它固定为2号索引节点(try ls -lid /
)。
使目录像文件一样使分配目录条目等的空间变得容易,因为必须始终存在为文件分配块的功能。另外,由于它们使用所需的相同数据块,因此无需事先在文件数据和目录列表之间分配空间。
目录条目的存储方式内部在文件系统之间有所不同,例如在ext2
和之间发展ext4
。现代系统使用树而不是线性列表来加快查找速度。看这里。甚至古老的FAT文件系统都将目录存储为文件,但是至少在较旧的FAT中,根目录是特殊的。(FAT中目录条目的结构当然与Unix文件系统不同。)
因此,如果是这种情况,则从一个目录遍历到另一个目录需要磁盘从看似任意的位置读取,这对我来说似乎效率不高。
是的。但是,经常访问的目录条目(或基础数据块)可能会缓存在现代操作系统中。
集中保存所有目录的内容将需要预分配一个大区域,并且仍然需要在目录数据区域内进行磁盘搜索。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句