假设向ls somefile
发出请求。 UNIX中的文件系统如何从算法角度处理此请求?这是O(1)查询还是O(log(N)),取决于文件说从当前目录节点开始,或者是O(N)线性搜索,还是组合取决于某些参数?
答案 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这样的程序的典型流程是
这是一般流程,但是对于特殊情况和频繁情况,存在许多优化(如缓存最近和频繁路径的inode数量)。 它还取决于directoy文件的组织方式。在unix中,它基于创建时间强制读取每个条目并将查找时间增加到O(n)。在NTFS中,等效的目录文件是根据名称进行排序的。
答案 3 :(得分:0)