459 字
2 分钟
为什么要有虚拟内存
虚拟内存解决了什么问题
- 让程序能用比物理内存大得多的地址空间:8GB 内存的机器跑十几个浏览器标签页、IDE、Docker 容器,加起来早超了物理内存。虚拟内存把不常用的页换到磁盘 Swap 区,当前活跃的页留在内存里。
- 进程之间完全隔离:每个进程有自己独立的虚拟地址空间,进程 A 的
0x1000和进程 B 的0x1000指向不同的物理内存。一个进程的野指针最多把自己搞崩,不会影响别的进程,操作系统稳定性有了保障。 - 程序员不用担心物理内存布局:写代码时用的都是逻辑地址,程序可以被加载到物理内存的任意位置,操作系统通过页表做映射,对程序完全透明。
虚拟内存的工作原理
- 每个进程看到自己独占 4GB(32 位)或 256TB(64 位)的地址空间。
- 进程访问虚拟地址时,MMU 查页表找到对应的物理地址。
- 如果页不在内存里,触发缺页异常,操作系统从磁盘加载。
- 物理内存不够时,把不活跃的页换出到 Swap。
物理内存和 Swap 都满了会怎样?
Linux 内核会启动 OOM Killer,按一定算法选个进程干掉来释放内存。选的标准是尽量杀内存占用大但又不太重要的进程,通过 oom_score 打分。
为什么访问 Swap 会导致性能急剧下降?
磁盘和内存的速度差了 10 万倍。内存随机访问延迟大概 100 纳秒,机械硬盘寻道要 10 毫秒,SSD 也要几十微秒。一旦频繁换页,CPU 大部分时间都在等磁盘 I/O,系统就卡死了。
目录