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

And*_*zos 17 c linux mmap linux-kernel

如果我创建mmap(2)一个文件用prot的参数,PROT_READ只和文件支持它也是只读的,没有变化,有没有之间的性能差异(或根本任何区别)MAP_SHAREDMAP_PRIVATE?内核会在两者之间做些不同的事吗?

(文档仅指"更新"方面的行为差异,但因为它PROT_READ不存在更新.我想知道是否还有其他差异?)

Cel*_*ada 4

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

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

  • @Celada:内核确实做了一些不同的事情。`MAP_PRIVATE` 是_private_,因此逻辑上数据被加载到“秘密”位置(技术上它是 CoW)。虽然单向可见性(在文件中看不到映射的修改,但在映射中可能会看到文件修改)是可能的,但这很困难并且需要额外的工作。“MAP_SHARED”只会将缓冲区缓存中的同一页面提供给映射它的任何人。现在在这种情况下,双向可见性是自动的(因此得到保证)。如果未修改的页面已被调出,您将在私有映射中看到文件更改... (2认同)