| 项目 | 值 |
|---|---|
| 定义 | 将文件映射到进程的虚拟地址空间 |
| 访问方式 | 像访问内存一样访问文件(指针操作) |
| 系统调用 | mmap()(Unix/Linux)、CreateFileMapping()(Windows) |
| 核心优势 | 避免 read/write 的内核-用户空间数据复制 |
内存映射文件将一个文件或文件的一部分映射到进程的虚拟地址空间中,之后可以像访问普通内存一样通过指针来读写文件内容。
| 对比项 | 传统 read/write | 内存映射(mmap) |
|---|---|---|
| 数据复制 | 文件 → 内核缓冲 → 用户缓冲 | 文件 → 物理内存(一次复制) |
| 系统调用 | 每次 read/write | 只需 mmap 一次 |
| 随机访问 | 需要 seek + lseek | 直接用指针 |
| 适用场景 | 顺序读写 | 随机访问、大文件 |
| 特性 | 说明 |
|---|---|
| 按需加载 | 只有访问时才加载页面(懒加载) |
| 写回机制 | 修改过的页面由 OS 在合适时写回磁盘 |
| 共享映射 | 多进程可映射同一文件,实现共享 |
| 私有映射 | 修改不反映到文件(写时复制) |
| 考法 | 解题套路 |
|---|---|
| mmap vs read/write | mmap 减少数据复制次数(免内核 → 用户复制) |
| 缺页与文件映射 | 访问映射区域 → 缺页 → 从文件加载页面 |
| 共享映射 | 多进程映射同一文件 → 实现 IPC |
| 优势 | 随机访问高效、减少系统调用、减少数据复制 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。