当您的程序正在写入文件时,系统会崩溃吗?
另外,当您的程序写入文件时,它实际上不是直接写入磁盘,而是写入内存吗?
因为看起来,将写入的数据传输到内存,然后在完全写入后将数据传输回磁盘似乎更有效。
无论如何,无论您的程序是否直接写入磁盘,或者完成的文件是否正在由系统复制到磁盘上的各个位置,磁盘如何恢复数据?
答案1
因为看起来,将写入的数据传输到内存,然后在完全写入后将数据传输回磁盘似乎更有效。
在现代操作系统中,文件访问是经过缓冲的。程序会将数据写入操作系统维护的内存部分,当该区域已满或您关闭文件时,缓冲区将写入磁盘。这样,您可以根据需要将几 GB 的随机数据写入文件,但这样做不会消耗太多内存。同时,当您的程序一次写入几个字节时,磁盘子系统可以自由地执行其他操作。
无论如何,无论您的程序是否直接写入磁盘,或者完成的文件是否正在由系统复制到磁盘上的各个位置,磁盘如何恢复数据?
取决于操作系统和特定的文件系统。通常,数据被写入磁盘上的新文件。当您的程序关闭文件时,缓冲区将被刷新,目录将更新为指向新文件而不是旧文件,旧文件随后可以被删除。这可以避免系统在写入过程中崩溃时数据损坏——最后一刻更改目录会造成“原子”写入的假象。
其他策略也是可行的。有关文件系统和容错的整本教科书均可查阅。
最后,有时文件系统不能恢复文件。有时根本无法恢复。我上面提到的策略是针对您所问的问题的响应,据我所知,它们在保持磁盘一致状态方面非常有效。旧文件系统在这方面不太好,如果您恰好在写入磁盘时断电,文件或整个磁盘可能会受到损害。Norton Disk Doctor 等磁盘修复实用程序曾经有很大的市场。随着更可靠的操作系统实现,该市场似乎已经衰落,但其中一些产品仍然可用。
答案2
大多数现代文件系统已记入日记。这意味着文件/文件系统有更改日志。崩溃时,如果最后一项未标记为完成,则可以回滚;或者如果有足够的信息,则可以制定。
维基百科有这样的内容:
为了防止这种情况 [崩溃时数据丢失],日志文件系统会分配一个特殊区域(日志),提前记录将要进行的更改。崩溃后,恢复只需从文件系统读取日志并重播此日志中的更改,直到文件系统再次一致。因此,这些更改被称为原子的(或不可分割的),因为它们要么:成功(最初成功或在恢复期间完全重播),要么根本不重播(被跳过,因为它们在崩溃发生之前尚未完全写入日志)。
在 Windows(Vista 及更高版本)中,有一种称为卷影复制 (VSS) 的技术,它使文件系统以“写入时复制”的方式运行,这意味着当您写入文件时,旧文件不会被破坏,并且实际上会保持完整。这允许在崩溃后恢复,但更重要的是,它还允许在文件锁定且进程(例如备份服务)需要读取该文件时访问该文件的最后一个稳定版本。