在将数据写入磁盘之前,存在页面缓存。linux页面缓存刷新顺序
所以如果我有两个操作。
write(fileA)
write(fileB)
然后如果系统突然关机。 我们不主动调用sync()调用。
我想知道是否有可能我们写入fileB的数据已经刷新到磁盘,而我们写入fileA的数据没有刷新到磁盘?
在将数据写入磁盘之前,存在页面缓存。linux页面缓存刷新顺序
所以如果我有两个操作。
write(fileA)
write(fileB)
然后如果系统突然关机。 我们不主动调用sync()调用。
我想知道是否有可能我们写入fileB的数据已经刷新到磁盘,而我们写入fileA的数据没有刷新到磁盘?
要回答您的问题,您可能需要考虑在write()
之后的sync()
或fsync()
系统调用中确保数据立即同步到磁盘。
flush(或pdflush)内核线程负责将脏页面同步到磁盘。当系统正常运行时,所有脏缓冲区都会被同步/写入磁盘。然而,突然掉电的情况并非如此,因为尚未清除/同步到磁盘的数据明显丢失。
如果您在应用程序中没有调用sync()
,则在某些内核可调参数时,会将脏缓冲区写入磁盘。您可以通过sysctl
内核可调参数控制应用程序数据如何同步(不活动的脏页)。你可能要考虑阅读详细了解以下内容:
vm.dirty_expire_centisecs - 脏 页面必须多大(1/100秒一个的)是其中写入磁盘
VM之前。 dirty_writeback_centisecs - 内核多久会醒来 BDI冲洗线程脏页同步到磁盘
vm.dirty_background_ratio - 系统内存的百分比,当 脏,系统可以开始将数据写入磁盘
vm.dirty_ratio - 系统内存的百分比,其脏时的 过程中做写操作应该阻止写出脏页 磁盘
我相信这是可能的FILEB之前写入磁盘fileA,因为写入操作将被捆绑到块I/O请求中,并且可以由I/O调度器在块设备层重新排序,以尽量减少磁盘查找。
见内核文档有关的I/O调度的详细信息(电梯):在我的应用 http://lxr.free-electrons.com/source/Documentation/block/biodoc.txt#L885
是的,我不叫同步()。那么我想知道pdflush内核线程如何刷新数据?是否有arrry来记录脏页面,并且新的脏页面通过插入时间附加到此数组。那么pdflush将数据从头部刷新到尾部? – baotiao 2014-11-03 09:34:09
[enum pageflags](http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/page-flags.h)有一个字段“PG_dirty”。 – askb 2014-11-03 12:08:10