虚拟内存是什么,如何分配?

考查重点:地址映射与按需分配。程序用虚拟地址,MMU 按页表映射物理页;申请地址空间不等于立即占用物理内存,首次访问可触发缺页分配

本题目录

参考答案

核心回答

虚拟内存是操作系统向进程提供的地址空间抽象。程序使用虚拟地址,操作系统维护映射和访问权限,CPU 的 MMU 按这些规则把地址转换成物理地址。它让进程默认相互隔离,也支持物理页共享、按需加载和内存回收。

以 Linux 常见的分页管理为例,“分配内存”要分层理解:

  1. 申请地址区域:程序通过分配器申请内存。分配器可以复用已有空闲块,必要时再通过 brk、mmap 等机制向系统取得更多虚拟地址区域,并不是每次 malloc 都发起系统调用。
  2. 建立区域和映射规则:内核记录这片区域是否合法、可否读写、对应文件还是匿名内存等。取得虚拟区域,不代表所有物理页都已分配并驻留。
  3. 按需提供物理页:实际访问尚未建立有效映射的合法页面时,可能触发缺页异常。内核按情况分配零页、读取文件或交换页、处理写时复制,再更新页表并恢复执行。
  4. 完成地址翻译:CPU 利用 TLB 缓存和页表,把虚拟页号映射为物理页帧,保留页内偏移。虚拟地址连续,并不要求对应物理页连续。

虚拟内存不等于“拿磁盘当内存”。Swap 是内存回收的一种后备机制;即使关闭 Swap,地址隔离、分页映射等虚拟内存机制仍然存在。

进一步解释

页表、TLB 和缺页异常怎么串起来?

页表保存映射及权限信息,TLB 缓存近期的地址翻译结果。TLB 未命中时通常继续查页表,不能把一次 TLB Miss 直接等同于缺页。

假设采用 4 KiB 页面,虚拟地址 8197 对应虚拟页号 2、页内偏移 5。若该虚拟页映射到物理页帧 7,那么对应物理地址就是 7 × 4096 + 5 = 28677。这是分页换算示例,实际页大小取决于架构、内核配置和是否使用大页。

如果映射尚未就绪或权限检查触发异常,CPU 将控制权交给内核。内核先检查访问是否合法:合法的按需分配、文件调入、写时复制可能被正常处理;非法地址或不允许的访问则可能导致 SIGSEGV 等错误。缺页不都是程序错误,也不都需要磁盘 I/O。

malloc 成功,为什么后面还可能内存不足?

常见按需分配下,申请阶段得到的是可使用的虚拟区域及相应资源承诺,而不是提前装满这片区域的独占物理页。Linux 的 overcommit 策略、进程限制、容器限制等也会影响申请与后续使用。

真正触碰大量页面时,如果无法通过回收等方式满足需要,仍可能出现 OOM。因此,虚拟空间大小不能直接当作实际占用:VSZ 描述虚拟空间规模,RSS 反映当前驻留的物理页,但共享页等又会影响统计含义。

类似地,free 把对象内存交还给分配器后,分配器可能保留区域以便复用,RSS 不一定立即下降。应用对象释放、虚拟映射解除与物理内存回收是不同层次。

内存不够时,系统如何腾出空间?

干净的文件缓存页可以丢弃,需要时从文件重读;脏文件页通常要先回写;匿名页在具备相应交换后备时可以换出。不能把回收一概说成“把任意内存写入 Swap”。

如果活跃工作集长期超过可承受容量,频繁回收和调入会造成抖动,延迟可能明显上升。虚拟地址空间大于物理内存,并不意味着程序能无代价地使用任意规模的数据。

常见追问

各进程的同一个虚拟地址,指向同一份数据吗?

通常不指向同一份数据,因为各进程有各自的地址空间和映射。显式共享映射、共享库页面或写时复制等场景,又可以让不同虚拟地址映射到同一物理页。是否共享由映射关系决定,不能只看地址数值。

为什么已经申请了连续数组,物理内存还能不连续?

数组需要连续的虚拟地址,页表可以把其中各页映射到不同物理页帧。对程序而言,地址仍按数组下标连续计算;跨页时的映射由硬件和内核完成。

参考资料

  • 国内:JavaGuide:虚拟内存详解:采用虚拟地址与物理地址、分页换算、TLB 和缺页异常的主线,说明一次内存访问怎样找到实际页面。
  • 国内:JavaGuide:内存管理详解:采用分配器与内核的分工、VSZ/RSS、overcommit、mmap 和写时复制的解释,区分申请地址、占用物理页和回收资源。
  • 国内:小林 coding:为什么要有虚拟内存?:采用进程隔离、分页和按需加载的说明,解释为什么相同虚拟地址可以对应不同物理页,连续地址也不要求物理连续。
  • 国外:Linux Kernel:Concepts overview:核对虚拟内存抽象、层级页表、TLB 及不同架构的页大小,说明虚拟内存同时承担保护和受控共享的职责。
  • 国外:Linux man-pages:mmap(2):核对虚拟映射、访问权限、共享与私有映射及预填充选项,说明建立映射和实际页面准备之间的区别。

相关面经

10 篇

虎牙

全栈开发
校招秋招一面
查看原面经 →
虚拟内存和物理内存是什么?

腾讯音乐

后端开发工程师
秋招一面
查看原面经 →
虚拟内存和物理内存是什么?

小米

C++
校招一面
查看原面经 →
操作系统内存管理知道什么?C++ 内存管理知道什么?

蚂蚁集团

面经合集
查看原面经 →
操作系统的内存分配

水滴

质量保障工程师(AI)
校招秋招一面
查看原面经 →
什么是虚拟内存?
展开剩余 5 篇面经

BIGO

客户端开发工程师
秋招二面
查看原面经 →
虚拟地址空间是什么,有什么作用?

字节跳动

后端开发工程师(AI / Agent 方向)
二面
查看原面经 →
什么是虚拟内存?虚拟内存如何分配?

字节跳动

后端开发工程师
一面
查看原面经 →
讲讲操作系统中的虚拟空间

美团

全栈开发工程师
一面
查看原面经 →
虚拟内存

快手

后端开发工程师
一面
查看原面经 →
为什么要用虚拟内存?

收录题集

1 个来源,共1 份题集

相关题目

4 题