免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: faku
打印 上一主题 下一主题

多个进程mmap同一个文件,MAP_SHARE方式,会映射到同一块内存吗? [复制链接]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
11 [报告]
发表于 2013-04-28 09:33 |只看该作者
linux_m 发表于 2013-04-27 21:12
回复 9# MMMIX
1.进程间可以通过mmap()来实现共享内存,那也就是进程都映射了同一块物理内存吧


多个进程通过mmap()映射的物理内存可不可能是同一块?可能。多个进程通过mmap()映射的物理内存是不是肯定是同一块?不一定。

回到你的问题:多个进程使用 mmap(..., MAP_SHARED, ...) 映射同一个文件,这个文件在物理内存中有几份?这其实是实现者要考虑的问题,可以是一份,也可以是几份,由实现方法决定。作为使用者,只需要关注这种调用的语义即可,也即一个进程对被映射文件的修改对其它进程可见。

论坛徽章:
0
12 [报告]
发表于 2013-04-28 10:01 |只看该作者
回复 11# MMMIX
明白了。
关于那个munmap()的调用,能否讲讲呢。它在内核中的具体实现是怎样的?


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
13 [报告]
发表于 2013-04-28 16:08 |只看该作者
回复 10# linux_m


    你看下 mm/mmap.c 中 munmap() 是怎么实现的就清楚了。

论坛徽章:
0
14 [报告]
发表于 2013-04-29 23:00 |只看该作者
把同一个文件map到内存中时候系统会先把这个文件装入内存,这时就有一个可以访问的物理地址(PA),然后请求文件的进程会得到一个相应的虚拟地址(VA),对应到该进程的地址空间中。如果有其他进程也请求映射这个文件,那么系统不会另外装入一次,而是会将新的VA也映射到PA,这样文件有惟一的物理地址,而每个进程的虚拟地址是不一样的。当任何一个进程对文件进行修改的时候,系统会进行Copy On Write操作,把修改的一部分抽出单独存放,这时,进程间在内存级就有了不同的文件映像。

论坛徽章:
0
15 [报告]
发表于 2013-04-29 23:04 |只看该作者
btw。如果你真的想知道,也不是不可以,你可以用得到的虚拟地址层层深入page table,最终找到文件的实际物理地址,然后比较不同进程所映射的物理地址是否一致就可以了。其实不难,但是对要求你对内存映射有很好的理解,并且会一些底层的编程、调试技巧。

论坛徽章:
0
16 [报告]
发表于 2013-04-30 12:12 |只看该作者
给你举个形象的例子,比如在我的桌子上有一张纸,现在A和B都想看到这张纸的内容,我只要用一个摄像头对着这张纸,然后A、B分别访问这个摄像头,这样我在纸上的任何修改都可以被AB看到,而AB如果想要共享修改这张纸上的内容,告诉我,我来修改,修改之后结果AB也都能看到。

如果不想共享,那么我需要准备两张纸,一张给A看,一张给B看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP