如果我创建mmap(2)
一个prot
参数为PROT_READ
only 的文件,并且支持它的文件也是只读的并且不会更改,那么 和 之间是否存在任何性能差异(或根本差异MAP_SHARED
)MAP_PRIVATE
?内核会在两者之间做一些不同的事情吗?
(文档仅提及“更新”方面的行为差异,但因为它PROT_READ
不可能有更新。我想知道是否还有其他差异?)
如果我创建mmap(2)
一个prot
参数为PROT_READ
only 的文件,并且支持它的文件也是只读的并且不会更改,那么 和 之间是否存在任何性能差异(或根本差异MAP_SHARED
)MAP_PRIVATE
?内核会在两者之间做一些不同的事情吗?
(文档仅提及“更新”方面的行为差异,但因为它PROT_READ
不可能有更新。我想知道是否还有其他差异?)
在 下MAP_PRIVATE
,Linux 联机帮助页表示未指定在 mmap() 调用之后对文件所做的更改是否在映射区域中可见。情况并非如此MAP_SHARED
。因此,如果您需要映射的内容与文件的内容一起更新,您最好使用MAP_SHARED
. 如果底层文件本身是只读的并且无法更改,那么这当然不适用。
如果PROT_READ
使用 ,我看不出MAP_PRIVATE
和之间应该有什么不同MAP_SHARED
。事实上,尽管有上述关于未指定行为的警告,但我的猜测(我没有测试过)将是在实践中两者之间根本没有区别PROT_READ
。
系统mmap
调用最终调用do_mmap_pgoff
setup 来调用mmap_region
来完成实际工作。
它通过标志VM_SHARED
来指示它是共享还是私有映射vm_flags
到mmap_region
里面有do_mmap_pgoff
:
if (file)
{
switch (flags & MAP_TYPE)
{
case MAP_SHARED:
if ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE))
return -EACCES; /* error */
...
vm_flags |= VM_SHARED | VM_MAYSHARE;
if (!(file->f_mode & FMODE_WRITE))
vm_flags &= ~(VM_MAYWRITE | VM_SHARED);
/* fall through */
case MAP_PRIVATE:
...
break;
...
}
...
}
这表示如果有文件支持并且映射是MAP_SHARED
并且文件是只读的,则关闭VM_SHARED
共享标志。
但是VM_MAYSHARE
仍然设置,因此可以用来改变行为。