已经阅读了manual的msync
,我认为MS_INVALIDATE
的确切含义如下:
提供了三个进程p1,p2和p3。
p1和p2都使用mmap
和MAP_SHARED
同时读取和写入文件/tmp/data.txt
。
p3使用fread
读取相同的文件。
假设p1修改了文件,p2将立即看到修改。但是,不确定使用fread
的[[p3。
p1
在修改后用msync
调用MS_INVALIDATE|MS_SYNC
,则使用fread
的p3是确定以查看修改。这就是标志MS_INVALIDATE
的全部含义。我的理解正确吗?唯一的用途是此检查。
/* 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分别通过写/读syscall(又名缓冲区缓存)和mmap映射到的另一个(页面缓存)进入存储。但是,现在大多数基于Unix的系统都具有全局统一缓存,即,无论I / O来自何处,都将落入相同的内核内存中。当然,实现起来比看起来要复杂得多,但是在大多数基于UNIX的系统上,MS_INVALIDATE对我来说似乎是个空手。