UNIX上的文件系统如何查找文件?

时间:2011-01-16 02:17:46

标签: unix filesystems kernel

假设向ls somefile发出请求。 UNIX中的文件系统如何从算法角度处理此请求?这是O(1)查询还是O(log(N)),取决于文件说从当前目录节点开始,或者是O(N)线性搜索,还是组合取决于某些参数?

4 个答案:

答案 0 :(得分:2)

可以是O(n)。基于旧学校BSD快速文件系统等的经典Unix文件系统将文件存储为inode编号,并且它们的名称在目录级别而不是在文件级别分配。这允许您通过硬链接同时在多个位置存在相同的文件。因此,大多数Unix系统中的“目录”只是一个文件,列出了存储在该目录中的所有文件的文件名和inode编号。

在目录中搜索特定文件名只意味着打开该目录文件并解析它直到找到文件名的条目。

当然,现在有很多不同的Unix系统可用的文件系统,有些文件系统在查找文件时会有完全不同的内部语义,所以没有一个“正确”的答案。

答案 1 :(得分:2)

它的O(n),因为文件系统最初必须从物理媒体上读取它,但缓冲区缓存将根据您的* nix风格的虚拟文件系统(VFS)实现显着增加。 (注意第一次访问文件的速度比第二次执行完全相同的命令要慢?)

要了解详情,请阅读IBM's article on the Anatomy of the Unix file system

答案 2 :(得分:1)

像ls这样的程序的典型流程是

  1. 当前路径上的Opendir。
  2. 当前路径的Readdir。
  3. 通过命令行上提供的过滤器过滤OpenDir返回的条目。所以通常是O(n)
  4. 这是一般流程,但是对于特殊情况和频繁情况,存在许多优化(如缓存最近和频繁路径的inode数量)。 它还取决于directoy文件的组织方式。在unix中,它基于创建时间强制读取每个条目并将查找时间增加到O(n)。在NTFS中,等效的目录文件是根据名称进行排序的。

答案 3 :(得分:0)

我无法回答你的问题。也许如果你在源代码中达到顶峰,你可以自己回答你的问题并解释它是如何工作的。 ls.c ls.h

相关问题