Appearance
题目
进程 P1 和 P2 共享一个文件 R,该文件的页表项分别是 R1 和 R2,其在 2 个进程中的虚拟地址分别是 W1 和 W2,则下列说法中正确的是( )。
错因
A
走到了另一个极端。共享文件的核心特征是两个页表项指向同一个物理页框——所以页框号字段必然相同。其他位(如保护位 R/W、修改位、存在位等)可能因进程权限不同而不同(例如 P1 可写 P2 只读),但绝不是"完全不同"。"完全不同"意味着连物理页框号都不同,那就不叫共享了。
C
把"共享映射"和"私有映射 / 写时复制(COW)"混淆。题面明确"P1 和 P2 共享一个文件 R"——共享语义下两个进程访问的是同一份物理内存,P1 写 W1 必然立即反映到 P2 看到的 W2 上。把它当成 fork 后的 COW 那种"写时分裂",是把"共享文件映射"和"父子进程私有副本"混了类。
D
误以为"共享"意味着"地址也得相同"。每个进程都有独立的虚拟地址空间,文件被 mmap 进来时落在哪段虚地址由各自的内存分配器决定,没必要相同。mmap() 系统调用返回的地址通常就是进程当前可用的空闲虚地址段,两个进程返回的值很可能不同。共享的对象是物理页框,不是虚拟地址。
总解析
核心机制:进程间共享文件(典型实现是 mmap MAP_SHARED 或 SysV shmget)的本质——
让两个进程的页表项指向同一个物理页框,从而实现"两边看到的字节内容时刻一致"。
对照四个维度:
| 比较项 | P1 视角 | P2 视角 | 是否相等 |
|---|---|---|---|
| 虚拟地址(W1 / W2) | 各自地址空间内分配 | 各自地址空间内分配 | 不一定相等 |
| 页表项的物理页框号 | 指向共享物理页 | 指向同一共享物理页 | 相等 |
| 页表项的保护/修改位 | 取决于该进程权限 | 取决于该进程权限 | 可能不同 |
| 物理地址 | 同一物理页 | 同一物理页 | 相等 |
逐项核对:
- A 错:物理页框号必然相同,"完全不同"是错的;只有部分标志位可能不同。
- B 对:共享的本质就是物理地址相同——这是"共享"二字的工作机理。
- C 错:共享映射下一方写、另一方立即可见,这正是它和"写时复制"的关键区别。
- D 错:虚地址在各自独立的地址空间,没必要相同。
速记:共享文件 ⇔ 物理地址相同——其余四项(虚地址、PTE 内容、修改可见性)都不绑定。
最终答案是 B。