首页/操作系统/03-memory/内存映射文件 🔗 在 Obsidian 中打开
操作系统 · 03-memory

内存映射文件

重要度 ⭐⭐⭐ 操作系统/内存管理内存映射mmap文件映射
速查
内存映射文件把文件映射到进程虚拟地址空间,通过指针访问;相比传统 read/write 免去内核→用户空间的数据复制按需加载(访问时经缺页中断读入),共享映射可实现 IPC。

速查

项目
定义将文件映射到进程的虚拟地址空间
访问方式像访问内存一样访问文件(指针操作)
系统调用mmap()(Unix/Linux)、CreateFileMapping()(Windows)
核心优势避免 read/write 的内核-用户空间数据复制

核心概念

内存映射文件将一个文件或文件的一部分映射到进程的虚拟地址空间中,之后可以像访问普通内存一样通过指针来读写文件内容。

工作原理

  1. 调用 mmap() 将文件映射到虚拟地址空间的一个区域
  2. 访问该虚拟地址时,如果页面不在内存中,发生缺页中断
  3. 缺页处理程序将文件的相应部分读入物理内存
  4. 修改后的数据通过页面置换机制写回磁盘

与传统 I/O 的对比

对比项传统 read/write内存映射(mmap)
数据复制文件 → 内核缓冲 → 用户缓冲文件 → 物理内存(一次复制)
系统调用每次 read/write只需 mmap 一次
随机访问需要 seek + lseek直接用指针
适用场景顺序读写随机访问、大文件

共享内存映射

  • 多个进程可以映射同一个文件
  • 对映射区域的修改,其他进程立即可见
  • 实现进程间通信的一种方式

关键性质

特性说明
按需加载只有访问时才加载页面(懒加载)
写回机制修改过的页面由 OS 在合适时写回磁盘
共享映射多进程可映射同一文件,实现共享
私有映射修改不反映到文件(写时复制)

常见考法

考法解题套路
mmap vs read/writemmap 减少数据复制次数(免内核 → 用户复制)
缺页与文件映射访问映射区域 → 缺页 → 从文件加载页面
共享映射多进程映射同一文件 → 实现 IPC
优势随机访问高效、减少系统调用、减少数据复制

易错点

注意
  • mmap 不是把整个文件加载到内存——是按需加载(缺页时才加载)
  • mmap 映射的是虚拟地址空间,不是直接映射物理内存
  • 修改映射区域不一定会立即写回磁盘——OS 在合适时才写回(可通过 msync 强制)
  • mmap 适合随机访问大文件,顺序读写小文件用 read/write 更简单
  • 共享映射中,多进程看到的是同一份物理数据

核心结论

必背
  1. 内存映射文件通过将文件映射到虚拟地址空间,实现高效文件 I/O
  2. 按需加载:只有访问时才通过缺页机制加载文件内容
  3. 相比传统 read/write,减少了数据复制(内核空间 → 用户空间免复制)
  4. 多进程共享映射同一文件可实现进程间通信
  5. 适合大文件的随机访问场景

记忆卡片

什么是内存映射文件?
将文件映射到进程虚拟地址空间,通过指针访问文件内容。
mmap 相比 read/write 的优势?
减少数据复制(免内核 → 用户复制)、减少系统调用、随机访问高效。
mmap 是把整个文件加载到内存吗?
不是——按需加载,访问时才通过缺页机制加载。
共享映射如何实现 IPC?
多进程映射同一文件,对映射区域的修改其他进程立即可见。
mmap 适合什么场景?
大文件的随机访问(顺序读写小文件用 read/write 更简单)。

交互动画 · 内存映射 vs 传统 I/O

文件 / 磁盘数据源 内核缓冲page cache 用户缓冲read/write 进程传统方式 物理内存(页)缺页加载 进程(mmap)指针直接访问
点击按钮观察传统 read/write 与 mmap 的文件数据流动路径
mmap 把文件映射进虚拟地址空间,通过指针访问
橙色流动虚线 = 当前激活的数据路径;传统方式两次复制(经内核缓冲),mmap 只复制一次。

相关知识点

virtual-memory-management paging-and-segmentation

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。