如果我创建的mmap(2)
文件只有prot
参数PROT_READ
,并且支持它的文件也是只读且不会更改,是否有任何性能差异({1}}和MAP_SHARED
之间(或任何差异)?内核会在两者之间做些不同的事情吗?
(文档仅指“更新”方面的行为差异,但因为MAP_PRIVATE
没有更新。我想知道是否还有其他差异?)
答案 0 :(得分:3)
在MAP_PRIVATE
下,Linux联机帮助页指出,在映射区域中是否可以看到mmap()调用后对文件所做的更改是未指定的。 MAP_SHARED
的情况并非如此。因此,如果您需要将映射的内容与文件的内容一起更新,则最好使用MAP_SHARED
。如果底层文件本身是只读的并且无法更改,那么当然这一切都不适用。
如果使用PROT_READ
,我在MAP_PRIVATE
和MAP_SHARED
之间看不到其他任何不同的内容。事实上,尽管有关于未指明行为的上述警告,我的猜测(我没有测试过)将是实际上在PROT_READ
下的两者之间没有任何区别。
答案 1 :(得分:2)
mmap
系统调用最终调用do_mmap_pgoff
设置为调用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
仍然设置,因此可以用来改变行为。