xml*_*lmx 2 c linux filesystems operating-system mmap
看了的手册msync,我认为 的确切含义MS_INVALIDATE如下:
假设有三个进程p1、p2和p3。
p1和p2都使用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 的系统上是无操作的。