免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11486 | 回复: 15
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-24 19:57 |只看该作者 |倒序浏览
本帖最后由 faku 于 2011-09-24 20:33 编辑

我曾经做过实验, 即便是同一个进程映射同一个文件, mmap的返回值也是不同的, vptr1!=vptr2, 也就是说:文件映射到内存后, 不是同一块内存

但是, 使用MAP_SHARE方式后, 对vptr1操作, 这个更改对vptr2立刻就可见了, 就好像操作的是同一块内存一样

我的疑问是;
1: vptr1!=vptr2, 是否说明不是同一块物理内存?
2:如果不是同一块内存,那么就是内核保证一个进程修改对另外一个进程可见, 这不是很耗时吗?(高手能不能简单阐述一下原理)

论坛徽章:
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
2 [报告]
发表于 2011-09-24 20:51 |只看该作者
1: vptr1!=vptr2, 是否说明不是同一块物理内存?
faku 发表于 2011-09-24 19:57



    不能,你看到的是虛擬地址,而不是物理地址。

论坛徽章:
0
3 [报告]
发表于 2011-09-24 21:43 |只看该作者
不能,你看到的是虛擬地址,而不是物理地址。
MMMIX 发表于 2011-09-24 20:51



当然是虚拟地址,
但是
一个进程内的指针值不同, 能操作同一块内存吗?
char * p1;
char * p2;
p1!=p2
*p1 = 'A';
*p2=?    *p2不可能是'A'吧
反过来
指针值相同, 能操作不同的内存吗?
char * p1;
char * p2;
p1==p2
*p1 = 'A';
*p2=?    *p2有可能不是'A'吗?

论坛徽章:
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
4 [报告]
发表于 2011-09-25 08:27 |只看该作者
一个进程内的指针值不同, 能操作同一块内存吗?
faku 发表于 2011-09-24 21:43



    當然可以,如果他們都指向同樣的物理地址。

论坛徽章:
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
5 [报告]
发表于 2011-09-25 08:35 |只看该作者
本帖最后由 MMMIX 于 2011-09-28 08:38 编辑
我曾经做过实验, 即便是同一个进程映射同一个文件, mmap的返回值也是不同的, vptr1!=vptr2, 也就是说:文件映射到内存后, 不是同一块内存
faku 发表于 2011-09-24 19:57



    返回的虛擬地址不同,並不能說明其在物理內存中就有兩份,同一段物理地址完全可以映射到不同的虛擬地址,即使是在同一進程中。

论坛徽章:
0
6 [报告]
发表于 2011-09-27 21:25 |只看该作者
有点跑题了
虚拟地址到物理地址映射关系我不太关心

我只想知道多个进程mmap同一个文件, 在物理内存里到底有几份这个文件的拷贝
大家能不能给个测试思路啊

论坛徽章:
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
7 [报告]
发表于 2011-09-28 08:44 |只看该作者
虚拟地址到物理地址映射关系我不太关心

你应该关心,你的疑问的根子就在这。

我只想知道多个进程mmap同一个文件, 在物理内存里到底有几份这个文件的拷贝
faku 发表于 2011-09-27 21:25



    这个取决于你是如何 map 的,以及 OS 是如何实现的。

其实,如果你只是使用 mmap(2) 的话,只需要知道手册中描述的行为就可以了,物理内存中到底有几份拷贝根本不是你应该关心的问题。

论坛徽章:
0
8 [报告]
发表于 2013-04-01 11:32 |只看该作者
回复 7# MMMIX
1.假如有多个程序都调用mmap(),在物理内存中是不是映射的同一块物理内存呢?
2.为什么我在用户空间对映射的物理内存写数据后,在内核空间读不出呢?是不是得调用msyn()

论坛徽章:
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
9 [报告]
发表于 2013-04-01 22:43 |只看该作者
linux_m 发表于 2013-04-01 11:32
回复 7# MMMIX
1.假如有多个程序都调用mmap(),在物理内存中是不是映射的同一块物理内存呢?

不一定。

2.为什么我在用户空间对映射的物理内存写数据后,在内核空间读不出呢?是不是得调用msyn()

你是怎么确认你读的就是你写的内存地址?

论坛徽章:
0
10 [报告]
发表于 2013-04-27 21:12 |只看该作者
回复 9# MMMIX
1.进程间可以通过mmap()来实现共享内存,那也就是进程都映射了同一块物理内存吧
2.读的时候是在驱动中实现的,即用的是被映射的物理内存的地址。

ps:我想问下munmap()系统调用在驱动中的实现原理是什么?就像mmap()系统调用最后的确切实现是通过file_operation中的mmap()函数实现一样,munmap具体是怎么样的呢?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP