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

xml*_*lmx 2 c linux filesystems operating-system mmap

看了的手册msync,我认为 的确切含义MS_INVALIDATE如下:

假设有三个进程p1p2p3

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

p3用于fread读取同一文件。

假设p1修改了文件,p2将立即看到修改。然而,p3使用fread并不确定是否能看到修改。

如果p1在修改后调用msyncwith ,则p3 using肯定会看到修改。这就是旗帜的全部含义。MS_INVALIDATE|MS_SYNCfreadMS_INVALIDATE

我的理解正确吗?

小智 6

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;
        }
Run Code Online (Sandbox Code Playgroud)

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

一些链接: link1 link2