一文带你搞懂 Mmap 技术
大家好 , 我是树哥 。
相信大家在面试的时候会被问到:Kafka 为啥会这么快?其中我们都会说是因为 zero-copy 的缘故 , 但 zero-copy 中其实有很多种实现方式 , 例如:mmap + write、sendfile 等等 。这其中的 mmap 到底是咋回事呢?今天我们就来讲讲 mmap 技术 。
【一文带你搞懂 Mmap 技术】mmap 是一种内存映射文件的方法 , 即将一个文件或者其它对象映射到进程的地址空间 , 实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系 。
那么 mmap 技术有啥用呢?
答案是:减少数据文件复制 , 提高效率 。
想一下我们读取文件 , 然后将其通过网卡发送出去的流程 , 其整体流程如下所示:

文章插图
图片来自知乎博主艾小仙
上述数据读取和发送过程发生了 4 次用户态和内核态的上下文切换和 4 次拷贝 , 具体流程如下:
- 用户进程通过 read () 方法向操作系统发起调用 , 此时进程从用户态转向内核态 。
- DMA 控制器把数据从硬盘中拷贝到读缓冲区 。
- CPU 把读缓冲区数据拷贝到应用缓冲区 , 上下文从内核态转为用户态 , read () 返回
- 用户进程通过 write () 方法发起调用 , 上下文从用户态转为内核态
- CPU 将应用缓冲区中数据拷贝到 socket 缓冲区
- DMA 控制器把数据从 socket 缓冲区拷贝到网卡 , 上下文从内核态切换回用户态 , write () 返回

文章插图
图片来自知乎博主艾小仙
整个过程发生了 4 次用户态和内核态的上下文切换和 3 次拷贝 , 具体流程如下:
- 用户进程通过 mmap () 方法向操作系统发起调用 , 上下文从用户态转向内核态
- DMA 控制器把数据从硬盘中拷贝到读缓冲区
- 上下文从内核态转为用户态 , mmap 调用返回
- 用户进程通过 write () 方法发起调用 , 上下文从用户态转为内核态
- CPU 将读缓冲区中数据拷贝到 socket 缓冲区
- DMA 控制器把数据从 socket 缓冲区拷贝到网卡 , 上下文从内核态切换回用户态 , write () 返回
此时我们会想:那这到底是怎么实现的呢?
其实这一切的背后都是操作系统的功劳 。操作系统在这背后为我们做好了所有的映射和回写工作 。当我们对内存特定区域进行读写时 , 操作系统便会检测到这一操作 , 然后根据不同场景去做读磁盘或者写磁盘的操作 。
看到这里 , 对于 mmap 的理解基本上足够我们应用开发人员使用了 。
推荐阅读
- 叔叔带你去吃棒棒糖是什么梗 请你吃棒棒糖
- 一文读懂负载均衡算法实现
- 一文读懂Java/O流的使用方法和技巧
- “奥司他韦”怎么吃?囤不囤?一文读懂
- 一篇带你了解数据库索引的类型
- 一文读懂智能汽车驾驶员监控系统
- 一文讲解MySQL的主从复制
- 一文弄清混合云架构模式
- 古钱币|古钱币收藏入手指南——嘟嘟百科带你玩转收藏
- 一文了解系统性红斑狼疮的治疗方法 红斑狼疮能治愈吗