不区分大小写的文件系统如何访问文件?

Clo*_*kex 7 filesystems

我工作的一位程序员,他一生都在使用 Linux,他指责 Windows 有一个不区分大小写的文件系统(除其他外),他说这是最糟糕的想法,永远不会有好处。我说那只是因为他习惯了区分大小写的文件系统,而且拥有一个不区分大小写的文件系统更有意义(我的部分原因是我的名字是David,但如果你提到我,david我会仍然知道您的意思是我,这同样适用于文件)。然后他解释了他的立场,指出不区分大小写的文件系统必须导致性能下降。

所以现在我想知道......区分大小写的文件系统如何访问文件?让我试着解释一下我的想法:

假设您有一个区分大小写的文件系统(和操作系统内核等),实际上,如果存在一个名为 的目录exampleDir,我必须准确键入cd exampleDircd 到其中。如果我输入cd exampledir,我应该收到一个错误,该目录不存在。在我看来,这似乎是一个简单的案例。当我输入命令时,文件系统可以简单地获取我输入的确切字符(忽略内核可能会做什么以将当前工作目录路径添加到字符串等)并开始运行可用文件名列表,执行直接比较每个名字;例如:

for(var i = 0; i < files.length; i++) {
    if(filename == files[i]) return true;
}
Run Code Online (Sandbox Code Playgroud)

现在是有趣的部分,不区分大小写的文件系统(假设保留大小写,根据 Windows)。实际上,如果存在一个名为 的目录exampleDir,我可以输入cd exampleDircd eXamPleDIr并且我仍然可以成功进入该文件夹。我真正想知道的是,实现这一目标的代码是什么样的。为了保留大小写,目录名称必须与其大小写一起存储。那么这是否意味着每次要通过文件名访问文件时都必须进行两次大小写转换?这会转化为多少性能影响?是否有任何技巧可以减少使用不区分大小写的文件系统导致的性能下降?这就是我想象的文件系统代码必须看起来的样子:

for(var i = 0; i < files.length; i++) {
    if(toLowercase(filename) == toLowercase(files[i])) return true;
}
Run Code Online (Sandbox Code Playgroud)

请注意:由于我的问题似乎并不清楚,我绝对不是在问哪种类型更好,也不是在问优点和缺点是什么。我只是问(在技术方面)不区分大小写的文件系统如何处理人类可以使用随机大小写键入文件名的事实。

Law*_*ceC 4

操作系统通常与句柄一起工作。调用“open”函数,该函数指定文件名,并返回句柄。进一步的 I/O 调用采用句柄,而不是文件名。

其他需要文件名的功能包括创建文件、列出目录和删除文件。

因此,处理不区分大小写的任何性能影响都不会真正影响太多实际的 I/O,只会影响文件管理。

某些程序使用锁定文件来指示资源正在使用中。这可能会导致大量的创建和删除。

然而,进行两次比较而不是一次比较的开销可能只是一些额外的汇编语言指令的问题。意思是少于 50 个左右的周期。如果缓存未命中发生,可能是 500 或 5000。

这真的非常不值得担心,除非您确实担心在短时间内创建/删除数十亿个文件的性能。高磁盘 I/O 应用程序包括数据库等内容,数据库通常会打开一些非常大的文件,并在使用数据库时保持它们打开状态。因此,这类应用程序(通常需要所有磁盘 I/O 的应用程序)不会在必须解析文件名的地方进行大量调用。

在处理文件名的时间甚至接近瓶颈之前,介质的速度就将成为瓶颈。