mmap学习

一:内存映射的概念

内存映射即在进程的虚拟地址空间中创建一个映射内存映射,分为文件映射和匿名映射。映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。也可以将内核空间的一段内存区域同时映射到多个进程,这样还可以实现进程间的共享内存通信。

二:映射条件

mmap将一个文件或者其它对象映射进内存。mmap()必须以PAGE_SIZE为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。

三:使用场景

  1. 设备操作

将设备映射到用户空间,让用户程序可以直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。

2. 共享内存

进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read/write等操作。

(实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或system V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。)

2.1 不同进程获取fd的方式

2.1.1 不同进程open同一个文件名 获取fd

不同进程可以通过open同一个文件,根据各自获取的文件描述符fd,进行mmap.

2.1.2 进程间传递文件描述符fd

由首个进程open创建出文件,通过Unix域的socket将fd传给其他进程。这样免于所有进程都感知文件名。

具体原理参考博客:待补充

2.1 文件映射到内存的几个结论:

1.在linux中,内存的保护是以页为基本单位的,即使被映射文件只有一个字节大小,内核也会为映射分配一个页面大小的内存。当被映射文件小于一个页面大小时,进程可以对从mmap()返回地址开始的一个页面大小进行访问,而不会出错;但是,如果对一个页面以外的地址空间进行访问,则导致错误发生。因此,可用于进程间通信的有效地址空间大小不会超过文件大小及一个页面大小的和。

2.文件一旦被映射后,调用mmap()的进程对返回地址的访问是对某一内存区域的访问,暂时脱离了磁盘上文件的影响。所有对mmap()返回地址空间的操作只在内存中有意义,只有在调用了munmap后或者msync()时,才把内存中的相应内容写会磁盘,所写内容仍然不能超过文件的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值