MMap

作者: NapoleonY | 来源:发表于2021-04-09 17:54 被阅读0次
    1. mmap 是什么?
      本质是一种进程虚拟内存映射的方法,可以将一个文件、一段物理内存或其他对象映射到进程的虚拟内存地址空间。实现这样的映射关系后,进程就可以采用指针的方式来读写操作这一段内存,进而完成对文件的操作,而不必再调用 read/write 等系统调用函数了。

    2. 为什么对于大文件而言 mmap 的效率要高于 read/write?
      调用 read/write 进行的常规的文件系统操作中,函数的调用过程:

    • 进程发起读文件请求。
    • 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode。
    • inode 在 address_space 上查找要请求的文件页是否已经缓存在页缓存中。如果存在,则直接返回这片文件页的内容。
    • 如果不存在,则通过 inode 定位到文件磁盘地址,将数据从磁盘复制到页缓存。之后再次发起读页面过程,进而将页缓存中的数据发给用户进程。

      所以,总结来说,常规的文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的 Buffer 在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。
    而使用 mmap 进行的文件操作中,首先会创建新的虚拟内存区域与文件磁盘地址之间的映射关系,在之后数据访问中,如果发现内存中并无相应的数据,则发起缺页异常,通过已经建立好的映射关系,只使用一次数据拷贝就将数据从磁盘中拷贝到用户空间中,供用户态进程使用。

    参考

    1. Linux 操作系统原理 — mmap() 进程虚拟内存映射
    2. Linux内存映射mmap原理分析
    3. [原创] 深入剖析mmap原理 - 从三个关键问题说起
    4. mmap原理之详解
    5. mmap机制初探
    6. 理解inode

    相关文章

      网友评论

          本文标题:MMap

          本文链接:https://www.haomeiwen.com/subject/pexwkltx.html