我注意到在Windows上执行文件(.exe或.dll)时,它被锁定,无法删除,移动或修改.
另一方面,Linux不会锁定正在执行的文件,你可以删除,移动或修改它们.
当Linux没有时,为什么Windows会锁定?锁定有优势吗?
Linux有一个引用计数机制,因此您可以在文件执行时删除该文件,只要某个进程(以前打开它)有一个打开的句柄,它就会继续存在.删除文件时,将删除该文件的目录条目,因此无法再打开该文件,但已使用该文件的进程仍可使用该文件.一旦使用此文件的所有进程终止,该文件将自动删除.
Windows没有此功能,因此强制锁定文件,直到从中执行的所有进程完成为止.
我相信Linux的行为更可取.可能有一些深层的体系结构原因,但我发现最引人注目的主要(和简单)原因是,在Windows中,您有时无法删除文件,您不知道为什么,而您所知道的只是某些进程将其保留在使用.在Linux中它永远不会发生.
据我所知,linux 在运行时会锁定可执行文件 - 但是,它会锁定inode.这意味着你可以删除"文件",但inode仍然在文件系统上,不受影响,你真正删除的只是一个链接.
Unix程序一直使用这种思考文件系统的方式,创建一个临时文件,打开它,删除名称.您的文件仍然存在但名称已释放供其他人使用,其他任何人都无法看到它.
Linux会锁定文件.如果您尝试覆盖正在执行的文件,您将获得"ETXTBUSY"(文本文件繁忙).但是,您可以删除该文件,并且内核将在删除最后一次引用时删除该文件.(如果机器没有干净地关闭,那么当检查文件系统时,这些文件是"删除的inode没有d时间"消息的原因,它们没有被完全删除,因为正在运行的进程有一个对它们的引用,现在他们是.)
这有一些主要优点,您可以升级正在运行的进程,删除可执行文件,替换它,然后重新启动进程.甚至可以像这样升级init,替换可执行文件,并向它发送一个信号,它将重新执行()本身,而无需重启.(这通常由您的包管理系统自动完成,作为其升级的一部分)
在Windows下,替换正在使用的文件似乎是一个主要的麻烦,通常需要重新启动以确保没有进程正在运行.
可能存在一些问题,例如,如果你有一个非常大的日志文件,你删除它,但忘记告诉正在登录该文件的进程重新打开文件,它将保留引用,你会想知道为什么你的磁盘没有突然获得更多的可用空间.
你也可以在linux下使用这个技巧来获取临时文件.打开文件,删除它,然后继续使用该文件.当您的进程退出时(无论出于何种原因 - 甚至出现电源故障),该文件将被删除.
像lsof和fuser这样的程序(或者只是在/ proc // fd中查找)可以显示哪些进程打开了不再具有名称的文件.
我认为linux/unix不使用相同的锁定机制,因为它们是作为多用户系统从头开始构建的 - 预计多个用户可能使用相同的文件,甚至可能用于不同的目的.
锁定有优势吗?好吧,它可能会减少操作系统必须管理的指针数量,但是现在一天的节省量几乎可以忽略不计.我能想到锁定的最大优点是:你保存了一些用户可见的歧义.如果用户a正在运行二进制文件,并且用户b删除它,那么实际文件必须坚持到用户A的进程完成为止.然而,如果用户B或任何其他用户在文件系统上查找它,他们将无法找到它 - 但它将继续占用空间.对我来说并不是一个真正的问题.
我认为这主要是关于向后兼容窗口文件系统的问题.
我认为你对Windows太过绝对了.通常,它不会为可执行文件的代码部分分配交换空间.相反,它保持对可删除和DLL的锁定.如果再次需要丢弃代码页,则只需重新加载它们.但是使用/ SWAPRUN,这些页面将保持交换状态.这用于CD或网络驱动器上的可执行文件.因此,Windows不需要锁定这些文件.
对于.NET,请查看卷影副本.