msync 中标志 MS_INVALIDATE 的确切含义是什么?
What's the exact meaning of the flag MS_INVALIDATE in msync?
看了msync
的manual,我觉得MS_INVALIDATE
的确切含义如下:
前提是有p1、p2、p3三个进程。
p1和p2都使用mmap
和MAP_SHARED
同时读写文件/tmp/data.txt
。
p3 使用 fread
读取同一个文件。
假设p1修改了文件,p2会立即看到修改。不过p3 using fread
不一定能看到修改。
如果修改后p1用MS_INVALIDATE|MS_SYNC
调用msync
,那么p3用fread
是SURE才能看到修改。这就是标志 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 的系统上都是空操作。
看了msync
的manual,我觉得MS_INVALIDATE
的确切含义如下:
前提是有p1、p2、p3三个进程。
p1和p2都使用mmap
和MAP_SHARED
同时读写文件/tmp/data.txt
。
p3 使用 fread
读取同一个文件。
假设p1修改了文件,p2会立即看到修改。不过p3 using fread
不一定能看到修改。
如果修改后p1用MS_INVALIDATE|MS_SYNC
调用msync
,那么p3用fread
是SURE才能看到修改。这就是标志 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 的系统上都是空操作。