假设我正在异步使用c ++文件流。我的意思是从不使用std :: flush或std :: endl。我的应用程序将大量数据写入文件并突然崩溃。 缓存系统中剩余的数据是刷新到磁盘还是丢弃(并丢失)?
答案 0 :(得分:10)
使这个问题复杂化的是,有多个“缓存”正在发挥作用。
C ++流有自己的内部缓冲机制。流不会要求操作系统写入磁盘,直到(a)您已将足够的数据发送到缓冲区中,流库认为写入不会被浪费(b)您要求特定刷新(c)流处于行缓冲模式,您已发送endl
。程序崩溃时,这些缓冲区中的任何数据都将丢失。
操作系统将缓冲写入以充分利用可用的有限数量的磁盘IO。写作通常会在五到三十秒内刷新;如果程序员(或多个库)调用fdatasync(2)
或fsync(2)
或sync(2)
(它要求刷新所有脏数据),则会更快。当程序崩溃时,OS缓冲区中的任何数据都会被写入磁盘(最终),如果内核崩溃,则丢失。
硬盘驱动器将缓冲写入以尝试充分利用其缓慢的磁头,旋转延迟等。当操作系统刷新其缓存时,数据到达此缓冲区。当程序崩溃时,这些缓冲区中的数据将写入磁盘,如果内核崩溃,可能会写入磁盘,如果电源突然被删除,可能会写入磁盘从驱动器。 (有些人有足够的力量继续写缓冲区,通常这需要不到一秒的时间。)
答案 1 :(得分:0)
库缓冲区(用std :: flush等刷新)中的东西丢失了,操作系统内核缓冲区中的数据(你可以用fsync()刷新)不会丢失,除非操作系统本身崩溃