当应用程序崩溃时,如何处理Linux缓冲区caching?

比方说,我正在使用asynchronousc ++文件stream。 我的意思是从来没有使用std :: flush或std :: endl。 我的应用程序将大量数据写入文件并突然崩溃。 caching系统中的数据是否被刷新到磁盘,或被丢弃(丢失)?

复杂的问题是有多个“缓存”在使用。

C ++流有自己的内部缓冲机制。 流不要求操作系统写入磁盘,直到(a)你已经发送了足够的数据到缓冲区,流库认为写不会被浪费(b)你特别要求flush(c)流处于行缓冲模式,并且已经沿着endl发送。 程序崩溃时,这些缓冲区中的任何数据都将丢失。

操作系统将缓冲写入,以充分利用有限数量的可用磁盘IO。 写入通常会在五到三十秒内被刷新; 如果程序员(或库)调用fdatasync(2)fsync(2)sync(2) (要求刷新所有脏数据sync(2) ,则更快。 操作系统缓冲区中的任何数据都会在程序崩溃时写入磁盘(最终),如果内核崩溃,则会丢失

硬盘驱动器将缓冲写入,以便充分利用缓慢的磁头,旋转延迟等。当操作系统刷新其缓存时,数据到达此缓冲区。 当程序崩溃时,这些缓冲区中的数据将被写入磁盘,如果内核崩溃, 可能会将其写入磁盘,并且如果电源突然从驱动器中移除, 可能会写入磁盘。 (有些人有足够的能力继续写下他们的缓冲区,通常这不到一秒钟。)

库缓冲区中的东西(用std :: flush或者flush等)会丢失,除非操作系统本身崩溃,否则操作系统内核缓冲区中的数据(你可以用fsync()刷新)不会丢失。