背景:在 Java 中,我正在内存映射文件(共享)。
我正在该文件的地址 0 处写入一些值。我了解 PAGE CACHE 中的相应 PAGE 被标记为 DIRTY,稍后将根据dirty_ratio 等设置写入。
到目前为止,一切都很好。
但是我想知道当内核将脏页写回文件时再次在地址 0 处写入时会发生什么。我的进程是否以某种方式阻塞等待写回完成?
背景:在 Java 中,我正在内存映射文件(共享)。
我正在该文件的地址 0 处写入一些值。我了解 PAGE CACHE 中的相应 PAGE 被标记为 DIRTY,稍后将根据dirty_ratio 等设置写入。
到目前为止,一切都很好。
但是我想知道当内核将脏页写回文件时再次在地址 0 处写入时会发生什么。我的进程是否以某种方式阻塞等待写回完成?
可能是。仅当设备级 I/O 请求在写入数据旁边包含校验和时才需要。否则,第一次写入可能会被撕裂,但可以通过第二次写入来纠正。
与往常一样,请仔细考虑电源故障、内核崩溃等的安全性。
据称在 btrfs 中避免了等待。(另外,碰巧的是,在遗留的 ext3 文件系统中。但不是 ext4 或 ext2)。
这看起来有点像一个移动的目标。上面(据我所知)描述了这个“稳定页面写入”代码的第一次优化,在它首次引入时的抱怨之后。提交描述提到了未来更改的几种可能性。
您可以查看一个 sysfs 属性,称为stable_pages_required