Appearance
内存映射文件
考情分析
内存映射文件在 408 中偶有考查,通常作为选择题的一个选项出现。🔥 低频但需了解。
传统文件 I/O 每次都要经过"用户态 → 内核态 → 拷贝数据"的流程,开销不小。有没有办法让程序直接用指针读写文件内容,就像操作普通内存变量一样?
基本概念
内存映射文件(Memory-Mapped File):将磁盘上的文件内容映射到进程的虚拟地址空间,之后对该区域的读写就等价于对文件的读写。就像在桌面上放了一面"魔法镜"——你在镜面上写字,文件里也跟着变。
工作原理
- 进程调用
mmap()系统调用,指定文件和映射范围 - OS 在进程的虚拟地址空间中划出一段区域,建立与文件的映射关系
- 此时并不立即读入文件内容
- 进程访问映射区域时触发缺页中断 → OS 将对应文件块调入内存
- 进程直接用指针读写内存,OS 负责将修改写回文件
与常规文件 I/O 的对比
| 比较项 | 常规 read/write | 内存映射 mmap |
|---|---|---|
| 访问方式 | 系统调用 | 直接内存访问(指针) |
| 数据拷贝 | 内核缓冲区 → 用户缓冲区 | 直接映射,减少拷贝 |
| 适用场景 | 顺序/小量读写 | 大文件、随机访问 |
| 共享 | 需要额外 IPC 机制 | 多进程可映射同一文件实现共享 |
内存映射文件用于进程通信
多个进程可以将同一个文件映射到各自的虚拟地址空间:
- 共享映射:对映射区的修改对其他进程可见,最终写回文件
- 私有映射:写时复制(Copy-on-Write),修改不影响其他进程
这种机制提供了一种共享内存的实现方式,比消息传递更高效。
与虚拟内存的关系
内存映射文件本质上利用了请求分页机制:
- 映射区域的页面按需调入(缺页时从文件读取)
- 内存不足时可以换出(脏页写回文件)
- 与虚拟内存的页面调度共用同一套机制
考研高频考点
- 🔥 内存映射文件的基本概念(文件映射到虚拟地址空间)
- 🔥 与常规 I/O 的区别(减少数据拷贝)
- 🔥 可用于进程间共享内存
内存映射文件是虚拟内存机制的一个具体应用。最后一个问题:虚拟内存系统整体性能如何分析、抖动怎么预防?下篇收尾。