我了解Linux上的默认write()行为(如果未使用O_DIRECT或O_SYNC等打开文件)是缓存写的-写操作在页面缓存中延迟。
请考虑以下情形:
1)程序将1KB数据写入到偏移量为5000的文件中,因此使相应页面成为脏页面
2)假设上一页尚未用pdflush刷新,则同一程序以后以相同的偏移量将1KB数据写入相同的文件,那么内核将做什么?
我认为Linux内核可能正在执行以下操作之一:
a)在发生辅助write()之前,先刷新了先前的脏页
b)先前的脏页被覆盖,并且pdflush仅在辅助write()到磁盘后刷新缓冲区
c)由于第二个write()使用新页面,我可能根本上是错误的。
最佳答案
您的问题的答案是以前的脏页被覆盖。
刷新器线程将脏页写回到备用设备后,脏页将被清除。但是即使页面被写回并且不再脏了,它也可能仍用于文件的相同偏移量。
在以下情况下,页面将返回到伙伴系统。
如果您对此感兴趣,建议您在 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/