我在读操作系统:三个简单部分 - 文件和目录,第 14 页。文中提到,重命名调用是作为系统崩溃时的原子调用实现的。假设我正在重命名文件文本文件在目录中目录到文本文件假设在写入包含 inode 或数据块的扇区时发生电源故障目录。这是否会导致该扇区处于半写入状态且不一致?
答案1
写入包含 dir 的 inode 或数据块的扇区时发生电源故障。这是否会导致该扇区处于半写入状态并处于不一致状态?
假设有一个旋转硬盘:
首先,当发生电源故障时,硬盘不会立即消失:它仍然有足够的电力储存在某处,将读写手移到着陆区,以避免磁头碰撞。(真正的早期硬盘没有这个功能,所以你实际上可以如果您没有发出“park”命令,则会导致磁头崩溃)。因此,我认为它也有足够的能力来完成特定扇区的写入。(虽然我不确定,但我从未在实验室环境中查看过硬盘,也没有测量过断电时会发生什么)。
其次,硬盘写入使用一种编码,将一个原始位“分配”到多个位上,并进行错误校正。在目前的密度下一些物理位总是会被读错,所以这是必要的。因此,如果实际发生半途而废的写入,扇区将变得不可读(而不是不一致)。
因此,如果您愿意,“重命名成功”和“重命名未发生”之间存在第三种状态,即“目录不再可读”,但这种第三种状态也可能由于与任何重命名无关的其他原因而发生。
假设是 SSD:
SSD 不会重写块,而是写入新块,然后自动更新其映射,以表示“此逻辑块现已被此物理块替换”。 原子更新是单次写入操作,并且容量等中会留有足够的电量,即使发生电源故障,此操作也可以成功。
再次强调,SSD 还有第三种状态,即“发生了太多写入操作,SSD 无法再写入”,但在这种情况下目录仍将使用旧名称。
答案2
问题是:您(和大多数人)所理解的“原子”一词的含义与该短语作者的含义不同。
所以让我们打破这个神话:“它是原子的,所以不可能发生不一致”。错了!
在同一文件系统内移动文件(重命名)时,系统调用确实是原子的,但其意思是,就软件环境而言,这是原子的。
原子性在这里意味着,任何查找该文件的进程都会在旧位置或新位置看到它。没有进程能够观察到该文件具有不同的链接计数,或者该文件在新名称/目录中出现后又以旧名称/目录出现,或者该文件在新名称和旧名称下都丢失。
但是,如果系统由于错误、磁盘错误或断电而崩溃,则无法保证文件系统保持一致状态,更不用说移动不会半途而废。
Windows 和 Linux 都无法保证硬件事件的原子性。这就是为什么这些操作系统包括chkdsk
适用于 Windows 和fsck
Linux 的磁盘测试和修复实用程序以及许多其他免费和商业实用程序。
某些文件系统格式对重命名操作的崩溃具有更好的弹性。Linuxext
家族在这方面可能表现优异。弹性更强的磁盘文件格式包括操作日志,允许完成或撤消中断的磁盘操作,并在启动期间自动恢复。