linux下共享内存mmap()方法和shmget()方法的疑问?
先贴出两个写得比较好的文章,以供大家参考:
http://www.ibm.com/developerw...
http://www.ibm.com/developerw...
1,在上面的第一篇文章中,第一部分的第3,4两点,讲的其实是:第一次调用mmap
后,要访问时,进程空间并没有和物理地址进行映射,会返回一个缺页异常,然后会去找相应的物理内存页面,没找到的话再把磁盘文件加载物理内存中。
而我之前的理解一直是:第一次调用mmap
后,要访问时,进程空间已经和物理地址进行映射,但磁盘文件还没有加载到物理内存,所以会返回一个缺页异常,然后缺页处理程序会去把磁盘文件加载物理内存中。
不知道上面是我的理解正确,还是文章作者的正确,不过估计是我错了,在这里是想再确认一下。
2,还有,如果要做共享内存,第一个进程调用完mmap
,要访问的时候会引发缺页异常。那么当第一个进程访问完比如说已经写了一段数据到共享内存区了。第二个进程再调用mmap
,要访问的时候还会报缺页异常吗?其实如果上面那个问题解决了,那这个问题的答案也就知道了。
3,在实际应用中,shmget
和mmap
哪个用的比较多啊?
4,shmget是创建一个共享内存区域与一个文件对应起来,这个文件的目录不一定是/dev/shm/**×××**
下吧,别的目录也可以吧?只要这个文件存在,那这个文件一开始的格式有什么要求吗?
跪谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1.mmap其实跟物理地址的映射没什么关系,它的作用实际是创建一段虚拟进程空间的地址,将对象映射到这段地址,而使用文件fd的原因是用来指定这个对象,不同进程之间可以通过这个文件来保证映射到进程空间的是同一个对象,达到使用共享内存的目的。所以实际上并不一定是一个实际的文件,不会有磁盘文件加载到物理内存,文章中你也看到,父子进程可以同过匿名对象来使用共享内存,方式就是将fd设为-1.
返回缺页异常则是另外一个问题了,你可以再找一些更详细的资料。我简单说一下,当虚拟存储器的空间被创建后,这个时候还只是虚拟进程空间地址的概念,所以没有映射到真实的物理内存,当你第一次访问这段内存时,物理内存中是找不到的,就会返回缺页异常,操作系统就会寻找一页物理内存,将这段虚拟空间的地址映射到真实物理内存中,这其实是一个比较复杂的过程,你可以再参考一些操作系统和计算机系统原理方面的资料。
2.当你理解了操作系统的内存管理之后,你就明白这个问题了,这跟mmap没什么关系。
3.都有,我个人经历的mmap多一些,shmget是system V的IPC通信,mmap是系统调用。
4.不一定,其他目录也可以。shmget是system V的IPC通信方式,都通过一个key值来创建,其实跟文件不一定有什么关系,用文件是通过ftok调用来生成同一个key值,如果你自己规定一个key并保证其唯一性也是可以的。