2014-11-03 112 views
4

在将数据写入磁盘之前,存在页面缓存。linux页面缓存刷新顺序

所以如果我有两个操作。

write(fileA) 
write(fileB) 

然后如果系统突然关机。 我们不主动调用sync()调用。

我想知道是否有可能我们写入fileB的数据已经刷新到磁盘,而我们写入fileA的数据没有刷新到磁盘?

回答

0

要回答您的问题,您可能需要考虑在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 - 系统内存的百分比,其脏时的 过程中做写操作应该阻止写出脏页 磁盘

+0

是的,我不叫同步()。那么我想知道pdflush内核线程如何刷新数据?是否有arrry来记录脏页面,并且新的脏页面通过插入时间附加到此数组。那么pdflush将数据从头部刷新到尾部? – baotiao 2014-11-03 09:34:09

+1

[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