Linux kernel linux页面缓存刷新顺序

Linux kernel linux页面缓存刷新顺序,linux-kernel,page-caching,Linux Kernel,Page Caching,在我们将数据写入磁盘之前,存在页面缓存 如果我有两个手术 write(fileA) write(fileB) 然后如果系统突然关闭我们不主动调用sync()调用。 < P> >我想知道我们写给FILEB的数据是否已经刷新到磁盘,而我们写给Fiela的数据还没有被刷新到磁盘?< P> >简短地回答您的问题:在代码< >()之后,您可以考虑在应用程序中调用同步()/或 fSycC()/Case>系统调用。以确保数据立即同步到磁盘 flush(或pdflush)内核线程负责将脏页同步到磁盘。当系统正

在我们将数据写入磁盘之前,存在页面缓存

如果我有两个手术

write(fileA)
write(fileB)
然后如果系统突然关闭我们不主动调用sync()调用。


< P> >我想知道我们写给FILEB的数据是否已经刷新到磁盘,而我们写给Fiela的数据还没有被刷新到磁盘?

< P> >简短地回答您的问题:在代码< >()之后,您可以考虑在应用程序中调用<代码>同步()/<代码>或<代码> fSycC()/Case>系统调用。以确保数据立即同步到磁盘

flush(或pdflush)内核线程负责将脏页同步到磁盘。当系统正常关闭时,所有脏缓冲区将同步/写入磁盘。但是,在突然断电的情况下,情况就不一样了,因为尚未刷新/同步到磁盘的数据显然会丢失

如果在应用程序中不调用
sync()
,则在某些内核可调时会将脏缓冲区写入磁盘。您可以通过
sysctl
kerneltunable控制应用程序数据的同步方式(非活动脏页)。你可能想考虑更多地阅读以下内容:

vm.dirty\u expire\u centisecs-脏的文件有多大(1/100秒) 在将页面写入磁盘之前,必须先将其删除

vm.dirty_writeback_centisecs-内核将唤醒 BDI刷新线程将脏页同步到磁盘上

vm.dirty\u background\u ratio—系统内存的百分比,当 然后系统可以开始向磁盘写入数据

vm.dirty_ratio—系统内存的百分比,当对 执行写操作的进程应阻止将脏页写到 磁盘


我认为,文件B有可能在文件A之前写入磁盘,因为写入将被捆绑到块I/O请求中,I/O调度器可以在块设备层重新排序,以尽量减少磁盘查找

有关I/O调度程序(电梯)的更多信息,请参阅内核文档:

是的,我在应用程序中不调用sync()。然后我想知道pdflush内核线程如何刷新数据?是否有一个数组来记录脏页,并在插入时将新的脏页附加到此数组。然后pdflush将数据从头部刷新到尾部?有一个字段
PG\u dirty