第78期 | 每个进程都以为独占 4GB

操作系统 · · 九羲科技

第七章开篇。前面六章,进程从出生讲到收尸,又从收尸讲到调度:一次调用两次返回、写时才复印、僵尸、孤儿、时间片、vruntime、电费、组账。今天起,新的一章——内存管理。切口是:页表、虚拟内存、4GB 的骗局。开篇先问一个老问题:一个进程眼里的内存,到底是不是真的?

一、每个进程都以为独占 4GB

1962 年 12 月,曼彻斯特,Atlas 正式启用¹。物理上只有 16384 词磁芯加 98304 词磁鼓,加起来约十万词,可每个用户却能用上百万词的地址。机器自己在中间做了翻译:程序给的是虚地址,硬件加 Supervisor 查表换成实地址,不在磁芯里的页,从磁鼓里换进来。这就是“一层存储”:程序员再也不用手工做覆盖,把大程序拆成小块搬进搬出。Atlas 把“地址”从物理位置,变成了一个编号。

三十年后,386 把这套把戏做进了芯片。32 位地址,10 位页目录索引加 10 位页表索引加 12 位页内偏移²:页目录 1024 项,每项指向一张页表,每张页表又是 1024 项,每项指向一页 4KB。1024×1024×4KB,正好 4GB。每个进程都有一张自己的页目录,切换进程就是换 CR3 里的页目录地址——两个进程写同一个虚地址,落到的物理页完全不同,互不干扰。页表项里还藏着 present、可读可写、用户还是特权三位开关,隔离与保护,是这场骗局的副产品。

Linux 的经典 32 位布局,把骗局又加了一层:4GB 虚地址里,用户只能用下面 3GB,上面 1GB 留给内核³。进程以为自己独占 4GB,实际能摸到的只有 3GB,顶上那 1GB 一碰就触发异常——不是内存不够,是门根本没给你开。物理内存只有几 MB 的机器上,十个进程各以为有 3GB,系统靠页表加磁盘交换硬撑出这个幻觉。

Anderson 在 1972 年那句话,放在这里正好⁴:知道晶体管怎么工作,推不出操作系统;知道页表怎么查,也推不出“虚拟内存”这个概念——每一层都要新概念。虚拟内存不是物理内存的放大版,是换了一套看内存的方法。

二、内存不按地址找,按意思找

如果 AI 的操作系统先出现,内存大概不会先有“地址”这个概念。智能体的记忆分三层:正在用的上下文、刚用过的片段、沉在底下的权重与知识。找东西的方式不是算地址,是算意思:问一句“上周那个水表项目”,系统按相似度把相关片段捞回来,而不是按编号去取。

苗头已经在了。PagedAttention 把操作系统的分页思想,直接借去管大模型的 KV cache⁵:KV cache 切成块,逻辑上连续的序列,物理上落在不连续的块里,块还能共享、写时复制——和第 5 章 fork 的写时复制,是同一个笔法,换了个结字。MemGPT 更进一步,借鉴 OS 的内存分级:上下文窗口是主存,外部存储是磁盘,摘要换入换出就是换页,中断就是控制流⁶。

再推一格:未来的“页”,装的不再是 4KB 字节,而是 token 块、embedding 块;“缺页”不再是去磁盘取字节,而是去外部记忆里取一段意思;预取不再是顺序读下一页,而是预测下一步会想起什么。范式之眼也在这里:线性字节数组的地址运算是基址加偏移,向量空间的“找”是算距离、算相似——偏移那套算术,在这里失效了。

照见平时看不见的一层:这场新骗局的代价,谁在付?每个智能体都以为上下文是无限的,系统在背后悄悄做有损压缩:摘要掉细节、换出丢上下文。用户看不见被忘掉的是哪一句,账算不到被丢的东西头上。旧页表的骗局至少是无损的,新记忆的骗局是有损的——这一点,写进架构时就得先认账。

三、亲手看一张虚拟内存地图

手边任何一台 Linux 机器,三条命令,就能看见这张地图。

getconf PAGE_SIZE

返回 4096——页就是这么大,一切地址翻译都以它为单位。

cat /proc/self/maps

第一列是虚地址区间,第二列是 rwxp 权限,最后一列是文件或 [heap]、[stack]。注意区间之间的空洞:那些没列出来的地址,就是没映射的页,程序一碰就段错误。地图不是连续的,连续的只是幻觉。

ps -o pid,vsz,rss,comm -p $$

VSZ 是进程声称的虚拟大小,RSS 是真正占着的物理内存。VSZ 比 RSS 大得多,就是这期标题的数字版:声称的和实有的,差着一整个骗局。

落到普遍场景,同一张地图直接能套。一台跑本地模型的机器上,权重和 KV cache 抢同一块显存,PagedAttention 那种按块换页,就是本章的把戏在显存里重演;一台算力有限的边缘设备上,物理内存本来就小,什么常驻、什么换到存储上,是部署前先要算清的一笔账;视频 AI 平台里,一路视频的推理缓冲也可以当成“页”来管,告警触发时才换入,平常不必全占着;企业私有智能中心里,一个智能体的二十个子任务先分好上下文预算,再往下排,上下文换页就不是提示词技巧,而是内存管理。

觉 然 小 注

「凡所有相,皆是虚妄。」⁷虚地址是相,物理页是另一回事。地址只是给程序看的编号,不是给机器看的实——看清这一点,内存的真相才露出来。

引 用 与 出 处

  1. [1] Kilburn, T. et al. One-Level Storage System. IRE Transactions on Electronic Computers, 1962. https://ethw.org/Milestones:Atlas_Computer
  2. [2] MIT 6.828. Lecture 4: x86 Paging. 2005. https://pdos.csail.mit.edu/6.828/2005/lec/l4.html
  3. [3] Robert Love. Linux Kernel Development. Addison-Wesley, 2010.
  4. [4] Anderson, P. W. More is Different: Broken Symmetry and the Nature of the Hierarchical Structure of Science. Science, 1972. https://doi.org/10.1126/science.177.4047.393
  5. [5] Kwon, W. et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP, 2023. https://arxiv.org/abs/2309.06180
  6. [6] Packer, C. et al. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560, 2023. https://arxiv.org/abs/2310.08560
  7. [7] 鸠摩罗什译. 《金刚般若波罗蜜经》.

· · ·

← 返回资讯中心