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