当使用PROT_READ时,mmap MAP_SHARED和MAP_PRIVATE之间是否有区别?

时间:2013-01-19 23:16:57

标签: c linux linux-kernel mmap

如果我创建的mmap(2)文件只有prot参数PROT_READ,并且支持它的文件也是只读且不会更改,是否有任何性能差异({1}}和MAP_SHARED之间(或任何差异)?内核会在两者之间做些不同的事情吗?

(文档仅指“更新”方面的行为差异,但因为MAP_PRIVATE没有更新。我想知道是否还有其他差异?)

2 个答案:

答案 0 :(得分:3)

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

如果使用PROT_READ,我在MAP_PRIVATEMAP_SHARED之间看不到其他任何不同的内容。事实上,尽管有关于未指明行为的上述警告,我的猜测(我没有测试过)将是实际上在PROT_READ下的两者之间没有任何区别。

答案 1 :(得分:2)

mmap系统调用最终调用do_mmap_pgoff设置为调用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仍然设置,因此可以用来改变行为。