msync 中标志 MS_INVALIDATE 的确切含义是什么?

What's the exact meaning of the flag MS_INVALIDATE in msync?

看了msyncmanual,我觉得MS_INVALIDATE的确切含义如下:

前提是有p1p2p3三个进程。

p1p2都使用mmapMAP_SHARED同时读写文件/tmp/data.txt

p3 使用 fread 读取同一个文件。

假设p1修改了文件,p2会立即看到修改。不过p3 using fread 不一定能看到修改。

如果修改后p1MS_INVALIDATE|MS_SYNC调用msync,那么p3freadSURE才能看到修改。这就是标志 MS_INVALIDATE.

的所有含义

我的理解正确吗?

AFAIK,在linux内核上,MS_INVALIDATE实际上并没有做太多,这是来自msync.c

唯一的用途就是这张支票。

        /* Here vma->vm_start <= start < vma->vm_end. */
        if ((flags & MS_INVALIDATE) &&
                (vma->vm_flags & VM_LOCKED)) {
            error = -EBUSY;
            goto out_unlock;
        }

早期的 linux 系统有单独的存储 I/O 通过 write/read 系统调用(又名缓冲区缓存)和 mmap 映射到的另一个(页面缓存)。然而,现在大多数基于 unix 的系统都有一个全局统一缓存,即无论 I/O 来自哪里,它都会落在同一个内核内存缓冲区上。当然,实现比看起来要复杂得多,但 MS_INVALIDATE 在我看来在大多数基于 UNIX 的系统上都是空操作。

一些链接: link1 link2