虚拟内存(virtual memory) 给每个进程一种错觉:它拥有自己私有、连续的一整块内存地址(从 0 到一个很大的上限),而不管实际有多少物理 RAM、数据真正位于何处。操作系统和 CPU 的 MMU(Memory Management Unit) 在访问时实时地把这些虚拟地址翻译成物理地址。
这种错觉是怎样工作的
内存被切分成固定大小的(通常为 4 KB)。每个进程一份的 把每个虚拟页映射到一个物理 :
Virtual address space Page table Physical RAM
(per process) (shared)
┌──────────┐ page 0 ─────────▶ frame 5 ───────────▶ ┌────────┐ frame 5
│ page 0 │ │ │
│ page 1 │ page 1 ─────────▶ frame 2 ───────────▶ ├────────┤ frame 2
│ page 2 │ page 2 ─────────▶ (on disk) swap-in ──▶ │ │
│ ... │ └────────┘
└──────────┘
fork 之后的 copy-on-write 页)可以被映射进多个进程。如果一个进程触碰了一个不在 RAM 中的页,MMU 会触发一次 page fault,操作系统随即把它装入(从磁盘,或用零填充一个新页)。
虚拟内存是程序如何使用 RAM 的几乎一切之下的基础:进程隔离、为什么 fork 很快(copy-on-write)、为什么 memory-mapped file 能工作、以及为什么程序可以分配数 GB 内存而在被触碰之前并不由真实内存支撑。理解页和地址翻译,是通往 TLB、page fault 和 thrashing 等更深入主题的入口。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠