在追加模式下文件损坏

3

主要问题是:在考虑硬盘扇区大小(例如512)的情况下,通过将新数据附加到文件末尾是否可能导致数据损坏?

例如,如果我有1023字节的文件,附加1个字节,然后出现故障(停电、磁盘缓冲区问题等等),会发生什么?

在这种情况下,第二个扇区将处于什么状态?


这取决于你的文件系统。例如,日志文件系统更有可能恢复您的数据。 - arunkumar
1个回答

1

很难说。需要考虑多个抽象层,缓存和甚至简单的电传传播延迟。

你的代码可能已经写出一个字节。但操作系统不会立即写入该字节。这些天,击中驱动器是计算机可以执行的最慢的操作之一,因此它将缓冲该字节并查看是否有其他字节被阻塞输入缓冲区。

如果在缓存超时期内未发生任何事情,则将发送字节到驱动器以提交到介质。但驱动器本身也可能进行一些缓存等操作...需要考虑旋转延迟(实际扇区应该进入的位置必须实际位于写头下方才能被书写,这可能需要几毫秒)。

换句话说,将一个字节写入磁盘可能需要随机的时间才能真正写入磁盘介质。如果在此间隔期间发生停电,数据就丢失了。


我认为问题实际上是,如果硬盘每个扇区都写入数据,整个扇区的情况会如何?第二个扇区的511字节会发生什么? - excanoe
取决于断电前写操作进行到了哪个程度。如果字节已经写入磁盘,但系统元数据(文件大小)没有更新,则在机器重新启动后,操作系统仍将看到文件大小为1023字节。即使是日志文件系统也无法防止断电 - 因为在电源消失时仍在向磁盘上的文件写入数据。日志可以使写入速度更快,因为元数据和数据同时写入,但无法对写操作中途(或之前)断电做任何处理。 - Marc B
但是,如果我们跳过操作系统的软件层,那么在写入发生之前的数据会怎样呢?我会不会丢失已经存在于磁盘盘片上的一些数据?据我所知,如果最小的磁盘IO块是扇区块,那么我认为写入从第二个扇区大小的开头的第513个字节开始。我正确吗? - excanoe
是的,驱动器将不得不读取整个扇区,放入修改后的数据,然后写出整个扇区。它不进行字节级IO。一旦修改后的字节在物理磁盘上,它们就不会丢失。但是,如果相关的元数据也被更新了,那么它们实际上就丢失了,因为它们存在的记录不在那里。 - Marc B
只有当数据已经存储在磁盘上并且元数据表明它已经存储在磁盘上时,才可以认为是“安全”的。但这就像试图通过一个正在关闭的大门。你要么完全通过,要么被困住或切成两半。这是一种非此即彼的情况。 - Marc B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接