18

如果我创建mmap(2)一个prot参数为PROT_READonly 的文件,并且支持它的文件也是只读的并且不会更改,那么 和 之间是否存在任何性能差异(或根本差异MAP_SHAREDMAP_PRIVATE?内核会在两者之间做一些不同的事情吗?

(文档仅提及“更新”方面的行为差异,但因为它PROT_READ不可能有更新。我想知道是否还有其他差异?)

4

2 回答 2

4

在 下MAP_PRIVATE,Linux 联机帮助页表示未指定在 mmap() 调用之后对文件所做的更改是否在映射区域中可见。情况并非如此MAP_SHARED。因此,如果您需要映射的内容与文件的内容一起更新,您最好使用MAP_SHARED. 如果底层文件本身是只读的并且无法更改,那么这当然不适用。

如果PROT_READ使用 ,我看不出MAP_PRIVATE和之间应该有什么不同MAP_SHARED。事实上,尽管有上述关于未指定行为的警告,但我的猜测(我没有测试过)将是在实践中两者之间根本没有区别PROT_READ

于 2013-01-19T23:23:20.707 回答
2

系统mmap调用最终调用do_mmap_pgoffsetup 来调用mmap_region来完成实际工作。

它通过标志VM_SHARED来指示它是共享还是私有映射vm_flagsmmap_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仍然设置,因此可以用来改变行为。

于 2013-01-20T00:15:40.200 回答