物理内存与虚拟地址空间的交界处:一个系统工程师眼中的秩序之美
物理内存与虚拟地址空间的交界处:一个系统工程师眼中的秩序之美

在大多数应用层开发者的心智模型中,内存往往是一个平坦、无限且廉价的数组。你调用一次 new 或 malloc,系统就返回给你一个看似干净的十六进制指针(例如 0x7ffee21a0040);你顺着这个指针读写数据,操作系统和硬件仿佛隐形了一般,忠实地在背后完成一切支撑。
然而,对于整天和高性能算子、大模型显存分配器打交道的底层系统工程师来说,这层平坦的表象之下,奔涌着一条充满精密规则与物理定律的壮阔河流。
在虚拟地址空间(Virtual Address Space)与物理内存(Physical DRAM)的交界处,存在着一个由 MMU 硬件电路、四级页表、TLB 缓存与 NUMA 拓扑交织而成的微观世界。每当我们在屏幕前写下一行张量分配代码,在这个交界处所掀起的时钟周期博弈与物理重排,有着一种令人屏息的机械秩序之美。
一、虚拟地址的假象与延迟分配的诚实
很多刚接触 Linux 内存子系统的人都会对一件事感到惊讶:
当你调用 void* ptr = malloc(16ULL * 1024 * 1024 * 1024); 成功申请了 16GB 的虚拟内存后,用系统监控工具查看进程的实际物理驻留集(RSS),你会发现物理内存占用居然几乎为 0。
这就是操作系统的乐观承诺(Demand Paging,按需分页)。
操作系统给你的仅仅是一串长达 48 位或 57 位的虚拟符号空间。它在内核的虚存区域(VMA, Virtual Memory Area)红黑树里记下一笔:“该区域合法,权限为可读写”。只要你的计算核心还没有真正向这个地址写入第一个字节,物理内存条上的电容阵列就根本不会为你分配哪怕一个物理页帧。
直到执行流水线发射出第一条写入指令:
movl $1, (%rax) # 首次触碰尚未分配物理内存的虚拟地址
硬件 MMU 拿着这个虚拟地址去查硬件页表,发现最低位有效标志位(Present Bit)为 0。CPU 硬件核心瞬间触发一个硬件中断——缺页异常(Page Fault,中断向量 14)。
在这一纳秒之间,处理器的执行状态被完整冻结,控制权交由内核中断服务例程:
- 内核在物理伙伴系统(Buddy Allocator)中找到一个空闲的 4KB 物理页帧;
- 将物理页的物理基地址填入进程四级页表的最后一级叶子节点中;
- 赋予只读或读写权限,刷新局部 TLB;
- 恢复用户态现场,让刚才那条被中断的
movl指令重新执行。
整个过程跨越了微架构中断、内核态切换、页表树构建与硬件恢复,耗时通常在 2 到 3 微秒。这种“只有在物理触碰的刹那才赋予真实物理实体”的设计,像极了量子力学里观测导致波函数坍缩的哲学隐喻。
二、NUMA 拓扑:距离是有物理成本的
随着单机算力核心数量迈向 64 核甚至 128 核,另一个物理事实无可回避地暴露在所有系统工程师面前:内存并不是等距的。
在对称多处理(SMP)时代,所有 CPU 核心访问同一根内存条的延迟是一致的。但随着总线带宽逼近物理极限,现代服务器全面转向了 NUMA(Non-Uniform Memory Access,非一致性内存访问)架构。
CPU 核心被划分为多个 Socket 或 NUMA 节点,每个节点拥有自己直连的本地物理内存控制器通道:
- 当位于 Socket 0 的核心访问挂在 Socket 0 下的本地内存时,延迟只有大约 60 纳秒;
- 当它试图访问挂在 Socket 1 下的远端内存时,数据必须跨越高速片间互联总线(如 Intel UPI 或 AMD Infinity Fabric),延迟瞬间拉长至 120 到 150 纳秒,带宽衰减近半。
在编写分布式推理系统或大模型算子时,如果你不注意线程亲和性(Thread Affinity)与内存分配策略(如使用 numactl --interleave 或 libnuma 的 numa_alloc_onnode),就会出现极其诡异的现象:同一份算子代码在多核上并发,由于部分工作线程在痛苦地进行跨节点“远端偷取内存”,导致系统整体 P99 延迟频繁被拖垮。
物理世界的空间距离,在以光速和电信号传播的芯片微观尺度上,依然有着冷酷而平等的账单。
三、大页与缓存行:在确定性中构建秩序
我常常觉得,系统工程师的终极追求,就是在不确定的软硬件波动中寻找确定性的秩序。
为什么我们要用 alignas(64) 消除缓存行伪共享?因为我们不想让物理硬件的 MESI 广播风暴干扰并行的节拍。
为什么我们要用 2MB 的 HugePages 替换 4KB 的碎片分页?因为我们不想让有限的 TLB 硬件条目在茫茫的四级页表漫游中迷失方向。
为什么我们要写出让编译器完全内联的无锁队列?因为我们希望每一条汇编指令的发射、每一个寄存器的换入换出,都在我们精密的物理推演之中。
秋日的黄昏,阳光透过百叶窗洒在主机箱微弱的散热蓝光上。键盘敲击的声音清脆而平稳,终端里反汇编出来的每一条 vmovups、每一处内存屏障、每一行经过 Concept 严密防御的现代 C++ 代码,都在按照预设的轨迹运转。
计算机软件的世界或许纷繁多变、潮流轮转,但只要底层的硅片依然遵守麦克斯韦方程组与微架构逻辑,这片由虚拟地址与物理页帧构建的交界之地,就永远是极客们最值得安放理智与热忱的纯粹圣殿。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)