我了解Linux上的默认write()行为(如果未使用O_DIRECT或O_SYNC等打开文件)是缓存写的-写操作在页面缓存中延迟。

请考虑以下情形:

1)程序将1KB数据写入到偏移量为5000的文件中,因此使相应页面成为脏页面

2)假设上一页尚未用pdflush刷新,则同一程序以后以相同的偏移量将1KB数据写入相同的文件,那么内核将做什么?

我认为Linux内核可能正在执行以下操作之一:

a)在发生辅助write()之前,先刷新了先前的脏页

b)先前的脏页被覆盖,并且pdflush仅在辅助write()到磁盘后刷新缓冲区

c)由于第二个write()使用新页面,我可能根本上是错误的。

最佳答案

您的问题的答案是以前的脏页被覆盖

刷新器线程将脏页写回到备用设备后,脏页将被清除。但是即使页面被写回并且不再脏了,它也可能仍用于文件的相同偏移量。

在以下情况下,页面将返回到伙伴系统。

  • 文件已关闭。因此,该文件的所有缓存页将被释放。
  • drop_caches is triggerd
  • 可用内存在水印之下,高速缓存页面将被回收。

  • 如果您对此感兴趣,建议您在 do_generic_file_read 中添加日志以进行验证。 page的结果= find_get_page(mapping,index)可以显示与文件索引相对应的实际页面结构地址。

    http://lxr.free-electrons.com/source/mm/filemap.c#L1478

    关于linux - 如果对同一页面执行两次write(),Linux脏页写回行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25856888/

    10-11 23:18
    查看更多