虚拟内存是什么?页表、TLB 和缺页异常如何配合?
🧑💻 面试官:什么是虚拟内存?
🙋♂️ 我:把硬盘当内存,所以程序可以使用更多内存。
🧑💻 面试官:两个进程看到相同地址,为什么一般不会读到对方的数据?
🙋♂️ 我:因为每个进程有自己的映射。
🧑💻 面试官:那缺页一定意味着读取硬盘吗?申请了十 GB 地址空间就占了十 GB 物理内存吗?
虚拟内存首先是地址抽象和保护机制,交换到磁盘只是相关能力之一。
面试速答(60 秒版)
程序通常使用虚拟地址,硬件结合页表把它翻译到物理页。这样可以隔离进程、控制访问,也能让不连续物理页组成连续的虚拟地址范围。
页表保存映射,TLB 缓存地址翻译。访问需要的页尚未建立可用映射,或权限不满足时,可能触发缺页异常,由系统判断如何处理。
缺页不一定读磁盘:按需分配零页、写时复制等也可能产生缺页;非法访问则不能靠补页解决。虚拟地址空间、实际驻留内存和交换空间不是一个指标。
排查内存问题要结合驻留量、缺页类型、回收和 I/O,不把虚拟内存简单说成磁盘扩容。

知识点详解:地址、映射和物理页各管什么
同一个地址,不等于同一份数据
假设进程 A 和 B 都使用某个相同数值的虚拟地址。它们的地址翻译上下文可以把这个地址映射到不同物理页,因此通常互不干扰。
若需要共享,系统也能有意让不同进程映射同一物理页;再通过权限和同步规则管理访问。这是受控共享,不是虚拟内存失效。
所以看到地址一样,不能直接推断数据一样;看到虚拟地址连续,也不能推断物理页连续。
页表管映射,TLB 缓存翻译
页表不是把应用全部数据装进去的容器,它记录地址翻译和权限等信息。TLB 保存近期使用的翻译,避免每次都完整查页表。
TLB 没命中,和页面不在物理内存不是一回事。前者可能只需重新获取翻译;后者还要看页的状态,是否需要分配、装入或其他处理。
实际页大小和页表组织取决于硬件与配置。大页可能减少翻译压力,但也会改变分配、回收等成本,不能只背“越大越快”。
缺页可以是正常工作,也可以是错误
假设程序申请一块很大的区域,只触碰其中少量页面。按需分配机制可能在第一次访问时才准备相关物理页,因此申请规模不等于已经驻留的规模。
再比如写时复制:多个映射暂时共享内容,写入时才分配私有副本。这可能产生缺页,但并不需要从磁盘读取那份内容。
而访问未允许的地址、写只读区域,系统可能报告错误或发送信号。缺页异常是处理入口,不是“系统一定能补救”的保证。
内存慢,要看工作集是否装得下
若持续需要的页面远大于可用物理内存,回收和重新装入可能反复发生,程序花很多时间等页面而不是做业务。
诊断先分别看虚拟占用、驻留占用、主要和次要缺页、交换与存储压力。缓存页、匿名页和不可回收页的处理也不同。
优化可以减少同时活跃的数据、分批处理、释放不用的引用或增加资源。只增加交换空间不一定改善延迟,还可能把内存不足变成持续 I/O 等待。
本题机制参考:Linux 内存概念、mmap 手册。
面试官继续追问
关掉 swap 就没有虚拟内存了吗?
没有。地址翻译、保护、文件映射和按需分页仍然存在。
TLB miss 一定很慢吗?
有额外翻译成本,但不等于磁盘读取;具体影响看访问局部性与硬件。
进程能共享内存吗?
能。需要明确共享映射、权限和同步机制,不能依赖两个数值相同的地址。
面试速记卡
- 虚拟内存:地址抽象、保护和受控共享。
- 页表:映射;TLB:翻译缓存。
- 缺页:不一定访问磁盘,也不一定可恢复。
- 指标:虚拟空间、驻留内存和 swap 分开。
- 优化:工作集与回收压力比申请大小更重要。
公司面试真题
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。
字节跳动 · 后端(抖音) · 社招
虚拟地址怎样转换成物理地址,分段和分页有什么区别?(题意整理)
社招一年半面经分享 · 抖音部分 ↗
历史面经,面试年份未明确;页面编辑于 2024-07-19