24 谈谈内存映射文件mmap

mmap技术是一种将文件或其他对象映射到进程虚拟内存中的方法(这个虚拟内存可以是指定的,也可以由操作系统自动选择),可以实现零拷贝和共享内存的效果。

为什么要有mmap

传统的修改一个文件的内容,一般需要如下三个步骤:

  1. 通过read系统调用,操作系统由用户态切换到内核态,将文件数据由磁盘控制器缓冲区读到PageCache中,然后再将PageCache中的数据拷贝到用户缓冲区中。
  2. 对用户缓冲区中的数据进行修改操作。
  3. 通过write系统调用,将用户缓冲区中数据拷贝到PageCache中,再将PageCache中的数据写回外存。

image.png

image.png

mmap实现原理

那么我们发现,如果可以实现直接在用户空间读写PageCache中过的内容,就减少了一次拷贝。

mmap刚好可以实现这件事。

mmap 系统调用可以将用户空间的虚拟内存地址与文件进行映射,进行绑定。绑定以后,对映射后的虚拟内存地址进行读写操作就如同对文件进行读写操作一样。

注:有的时候虽然已经建立了映射关系,但是还没有将文件移到内存中,当访问还没有调入PageCache中的页面的时候,由此会发生缺页中断,内核请求从磁盘调入页面。之后如果写操作改变了页面内容,一段时间后,系统会自动写回脏页面到磁盘中。(也可以调用msync来强制同步,写入文件)

何时将PageCache中的数据写回

前面我们介绍过,读写文件都需要通过PageCache,那么何时将PageCache中的数据写回呢?

  • 调用msync函数进行数据同步。(主动)
  • 调用munmap进行解除映射关系式。(主动)
  • 进程退出时。(被动)
  • 系统关机时。(被动)

mmap的主要优点和缺点

mmap的主要优点

  1. 文件映射到PageCache中,访问的时候不再需要系统调用,效率高。
  2. 可以由多个进程共享同一映射文件,便于实现进程间通信。
  3. 文件被映射到了内存,便于使用个内存访问的randomly 访问内存任意位置的数据,而不需要书怒读取文件,提升了效率。

mmap的缺点

  1. 文件必须是可被mmap的,不能是compress或者encode过的文件。
  2. 文件会occupy物理内存,可以导致其他程序的内存不足。
  3. 内存映射中的文件如果文件内容发生变化,不会自动写回数据。需要调用msync进行数据同步或者调用munmap进行解除映射关系。

猜你喜欢

转载自blog.csdn.net/weixin_68930048/article/details/130176489
24
今日推荐