Appearance
题目
关于内存映射文件,下列说法正确的是( )。
Ⅰ. 可实现进程间通信 Ⅱ. 实现了页面到磁盘块的映射 Ⅲ. 将文件映射到进程的虚拟地址空间 Ⅳ. 将文件映射到系统的物理地址空间
错因
B
把"文件映射到虚地址空间"和"文件映射到物理地址空间"搞反了。内存映射文件(mmap)的本质是建立"虚拟地址 → 文件偏移"的映射关系——给进程一段虚拟地址(这段地址在它自己的虚地址空间里),访问时由 OS 按需从文件读取真正的内容到物理页。所以 Ⅲ 对、Ⅳ 错;选 Ⅳ 等于把分页机制(虚→物)和文件映射(虚→文件)的角色弄混了。
C
错把 Ⅱ 当对,错把 Ⅰ 漏掉。Ⅱ "页面到磁盘块的映射"描述的是分页机制本身——任何一页(包括匿名页)都可能换出到磁盘块(swap),这不是内存映射文件特有的功能;说它是 mmap 的功能等于把通用机制误归为 mmap。Ⅰ 才是 mmap 的招牌用法之一:两个进程映射同一文件到各自虚地址空间,这块共享区就成了天然的进程间通信通道。
D
被 Ⅱ 这一项绊倒。如果误以为"内存映射文件 = 把磁盘文件映射成内存页",会把 Ⅱ "页面到磁盘块的映射"也当对。但严格来说Ⅱ 描述的是"页 → 盘块"方向(分页/换出/换入机制),与 mmap 直接做的"虚地址 → 文件"是两个层次的事,408 标准答案不把 Ⅱ 算作 mmap 的功能。
总解析
内存映射文件的本质(一句话):用 mmap() 调用让进程把一个文件的若干字节映射到自己虚地址空间的一段连续区域,之后像读写普通内存一样访问该文件,由 OS 按需缺页加载和回写。
关键映射关系:
进程虚地址段 ←→ 文件偏移段
(mmap 建立)OS 实际把这段虚地址的页表项标记为"映射文件 F 的偏移 [a, b)",缺页时再去文件里读对应字节填进物理页。
逐项判定:
| 项 | 描述 | 对错 | 关键理由 |
|---|---|---|---|
| Ⅰ | 可实现进程间通信 | ✓ | 多个进程 mmap 同一文件 → 共享同一物理页 → 一个写另一个立即看到(共享内存型 IPC) |
| Ⅱ | 实现了页面到磁盘块的映射 | ✗ | "页 → 盘块"是分页/换出机制,匿名页也有;不是 mmap 特有 |
| Ⅲ | 将文件映射到进程的虚拟地址空间 | ✓ | 这就是 mmap 的定义本身 |
| Ⅳ | 将文件映射到系统的物理地址空间 | ✗ | 进程接触不到物理地址;映射目标永远是虚地址空间,物理页是按需分配的 |
Ⅲ 与 Ⅳ 的对照:
| 映射方向 | 是哪个层 | 由什么完成 |
|---|---|---|
| 文件 → 虚地址空间 | mmap(地址空间布局) | OS mmap() 系统调用 |
| 虚地址 → 物理地址 | 分页 | MMU + 页表 |
| 物理页 → 文件磁盘块 | 缺页 / 写回 | 缺页中断处理程序 |
mmap 直接负责的只有第一行——所以"文件映射到虚拟地址空间"对,"文件映射到物理地址空间"错。
为什么 mmap 能做 IPC:当两个进程都用 MAP_SHARED 标志映射同一文件时,OS 让两段虚地址背后指向同一组物理页——任一进程对这块的写入对方立即可见。比起管道、消息队列、信号量,零拷贝是它的核心优势。
最终答案是 A(Ⅰ、Ⅲ)。