假设您的程序正在将信息写入文件。如果系统崩溃,磁盘如何恢复您的文件?

Kai*_*die 6 filesystems

当您的文件正在被您的程序写入时,系统崩溃会发生吗?

另外,当您的程序写入文件时,它实际上不是直接写入磁盘,而是写入内存吗?

因为看起来系统将写入的数据传输到内存中会更有效,然后当它完全写入时再将内容传输回磁盘。

无论如何,无论您的程序直接写入磁盘,还是完成的文件正在被系统复制到磁盘上的各个位置,磁盘如何恢复数据?

Cal*_*leb 7

因为看起来系统将写入的数据传输到内存中会更有效,然后当它完全写入时再将内容传输回磁盘。

在现代操作系统中,文件访问是缓冲的。您的程序写入由操作系统维护的部分内存,当该区域变满或关闭文件时,缓冲区将写入磁盘。通过这种方式,您可以根据需要将几 GB 的随机数据写入文件,但在执行此操作时不会消耗那么多内存。同时,当您的程序一次写入几个字节时,磁盘子系统可以自由地做其他事情。

无论如何,无论您的程序直接写入磁盘,还是完成的文件正在被系统复制到磁盘上的各个位置,磁盘如何恢复数据?

取决于操作系统和特定的文件系统。通常,数据会写入磁盘上的新文件中。当您的程序关闭文件时,缓冲区会被刷新,并且目录会更新为指向新文件而不是旧文件,旧文件随后可以被删除。如果系统在写入过程中崩溃,这可以避免数据损坏——在最后一刻更改目录会产生“原子”写入的错觉。

您可能想阅读有关日志文件系统事务文件系统的信息

其他策略也是可能的。整个教科书都可以在文件系统和容错方面找到。

最后,有时文件系统无法恢复您的文件。有时根本无法恢复。我上面提到的策略是对您所询问的各种问题的回应,据我所知,它们在使磁盘保持一致状态方面非常有效。较旧的文件系统在这方面不太擅长,如果您在写入磁盘时碰巧断电,则文件或整个磁盘可能会受到损害。曾经有一个很大的磁盘修复实用程序市场,例如 Norton Disk Doctor。随着更可靠的操作系统实施,该市场似乎已经减弱,但其中一些产品仍然可用。

  • 1) 当操作系统处理完一个文件系统时,它会将其标记为干净的。崩溃后,它发现它很脏,并且日志确实得到了处理。但是,这并不是说您获得了崩溃期间写入的文件中的原始数据或新数据。您只会获得一个处于正常状态的文件系统(没有标记为未使用的已使用块,没有悬空引用,正确的链接计数,......)。 (2认同)
  • @KaitlynMcmordie:“悬空引用”将是仍在目录中的文件名,但不再具有与之关联的物理文件。如果在删除文件期间计算机中途崩溃,就会发生这种情况 - 操作系统需要删除文件和文件名,并且它们通常存储在不同的位置。 (2认同)

Mal*_*ist 5

大多数现代文件系统都有日志记录。这意味着文件/文件系统有一个更改日志。在崩溃时,如果最后一个条目没有标记为已完成,则可以回滚它;或者如果有足够的信息,可以制定。

维基百科有这个:

为了防止这种[崩溃时的数据丢失],日志文件系统分配了一个特殊区域——日志——它提前记录了它将进行的更改。崩溃后,恢复只涉及从文件系统读取日志并从该日志中重放更改,直到文件系统再次保持一致。因此,这些更改被称为原子的(或不可分割的),因为它们要么:成功(最初成功或在恢复期间完全重播),要么根本不重播(被跳过,因为它们之前尚未完全写入日志崩溃发生)。

在 Windows(vista 及更高版本)中,有一种称为卷影复制 (VSS) 的技术,它使文件系统以“写入时复制”的方式运行,这意味着当您写入文件时,旧文件不会被被破坏,实际上完好无损。这允许在崩溃后恢复,但更重要的是,它还允许在文件锁定并且进程(例如备份服务)需要读取该文件时访问文件的最后一个稳定版本。