You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何mmap比传统文件IO更快?关于内存拷贝的疑惑求解

关于mmap与传统文件IO的拷贝次数误解及性能优势分析

很多博客声称mmap比传统文件IO更快的核心原因是减少了一次用户态与内核态之间的内存拷贝,但在写入场景下仔细拆解流程会发现这个说法容易让人困惑——我们以把用户空间字节数组char* bytes写入文件some-file.txt为例:

写入场景的拷贝次数对比

  • 传统write操作:调用write(fd, bytes, len)时,内核会将bytes中的数据拷贝到内核页缓存,之后内核在合适时机将页缓存中的数据写入磁盘。这确实是两次拷贝:用户空间字节数组 → 内核页缓存 → 磁盘。
  • mmap写入操作:先通过mmap()将文件映射到用户空间内存地址mmap_addr,之后调用memcpy(mmap_addr, bytes, len)把用户数据拷贝到映射区域,最终内核通过分页机制将该页缓存数据刷入磁盘。这同样是两次拷贝:用户空间字节数组 → 内核页缓存(映射区域) → 磁盘。

可见在这个写入场景下,两者的拷贝次数并没有差异,很多博客的说法其实混淆了读场景和写场景的区别:在读取文件到用户空间时,传统read需要把内核页缓存的数据拷贝到用户缓冲区(两次拷贝:磁盘→内核页缓存→用户缓冲区),而mmap允许用户直接访问内核页缓存的映射区域,无需这第二次拷贝,这才是减少一次拷贝的真实场景。

mmap在写入场景的实际性能优势

你提到的减少系统调用与上下文切换是写入场景下mmap的核心优势:

  • 传统write每次写入都需要触发系统调用,伴随用户态与内核态的上下文切换,频繁小批量写入时,上下文切换的开销会被放大。
  • mmap只需一次mmap()系统调用建立映射,之后所有写入操作都是直接操作用户态内存,无需额外系统调用,彻底避免了频繁上下文切换的开销。

除此之外,mmap还有额外的隐性优势:

  • 内存管理更高效:内核通过页回写机制批量处理脏页,能更合理地调度磁盘IO时机,减少零散IO带来的性能损耗。
  • 避免内核缓冲区的冗余:传统write可能会涉及内核层的额外缓冲区(如文件系统的写缓冲区),而mmap直接操作页缓存,减少了内核内部的数据拷贝(部分文件系统场景下)。

内容的提问来源于stack exchange,提问作者Yang Song

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:10:35