第82期 | 虚拟内存这场骗局,到底骗了谁?

操作系统 · · 九羲科技

四期走完,内存这一章也该收束了。Atlas、页表、小抄、缺页、驱逐,拼在一起,到底拼出个什么东西?

一、四步拼图,拼完这一章

先把四期拼起来。1962 年 Atlas¹ 把地址从物理位置变成了一个编号:一台只有约十万词存储的机器,让每个用户用上百万词的地址,中间隔着一层翻译。386² 把这层翻译做进了芯片:两级页表,1024×1024 个 4KB 页,正好 4GB,每个进程一张页目录,切换进程就是换 CR3,保护位顺带把隔离做了。上一期讲的翻译小抄,是把常用的翻译抄一份放在手边,查表慢,抄近路快,小抄里没有,就得回页表慢慢查。再往下,缺页把“先占位后取货”写进了制度:程序以为内存到手了,第一次碰到才真正分配;Denning³ 在 1968 年把一段窗口里碰过的页叫工作集,工作集住不下,系统就开始在倒页上空转;内存满了,Bélády⁴ 在 1969 年算出反常识的一笔:先进先出,页框从 3 个加到 4 个,缺页反而从 9 次涨到 10 次;Linux⁵ 用两档活跃度加时钟指针近似最近最久未用,脏页写回、干净页直丢,kswapd 在水位线以下提前动手。

四步拼完,骗局的全貌才看清:它骗的不是内存的大小,是三件事——每个进程独占、地址连续不断、取用不花代价。翻译要花时间,缺页要等磁盘,驱逐要选牺牲者,代价一笔都没少,只是被挪到了看不见的地方。Anderson⁶ 那句话放在章末正好:知道页表怎么查,推不出虚拟内存这个概念,每一层都要新概念。

二、AI 的内存不画地址

PagedAttention⁷ 把分页的笔法借去管 KV cache:逻辑上连续的序列,物理上切成块,块能共享、能按需分配。MemGPT⁸ 更进一步,把上下文窗口当主存、外部存储当磁盘,摘要换入换出就是换页。本周 Cerebras⁹ 的技术文章,把这套账算到了极致:拿开源 Kimi K3(约 3 万亿参数、93 层)当示意性算例,4-bit 权重、8-bit KV 缓存、平均 256k 请求的假设下,单层约 16GB,单片晶圆 44GB 片上内存;24 层稠密层每层独占一片,留出空间给随 token 增长的 KV 缓存,69 层线性注意力层只留固定大小的状态,一片能放两层,35 加 24,一共 59 片晶圆连成流水线,RDMA 每跳约 2 微秒,跑出 1000–2000+ tokens/秒。文章里最漂亮的一句,是“权重不动,只有激活在流动”。

对照本章的骗局看,Cerebras 等于把账本翻了个面:虚拟内存先许诺“地址随便画,不够磁盘顶”,代价事后算;晶圆方案先算清“权重住哪、KV 住哪、并发上限是多少”,再开工。线性层那一手尤其值得带走:固定状态换掉了随上下文增长的 KV,省的是内存,付的是表达能力——哪些层值得存 KV,正在变成架构设计本身的问题。还有一处得先认账:页表换页是无损的,原样取回;线性层的状态、摘要的换出,都是有损的,丢掉的细节不会自己长回来。旧骗局至少保真,新记忆的账本从一开始就有损。范式之眼也在这里收束:线性地址问的是“这页标记是 0 还是 1”,向量空间问的是“这段离当前意图有多远、重建有多贵”,偏移算术失效了,工作集、缺页、驱逐这套逻辑还活着。

Cerebras 技术文章配图:Kimi K3 的 93 层分层(69 层线性注意力层 + 24 层稠密层)。图片来源:Cerebras 博客。

三、今晚给内存算总账

收束的一期,动手也收束成一张总账。手边任何一台 Linux 机器,先看家底,再看回收干了多少活:

grep -E '^(MemTotal|MemFree|MemAvailable|Active|Inactive|SwapTotal|SwapFree)' /proc/meminfo

grep -E 'pgscan|pgsteal|pswp' /proc/vmstat

MemAvailable 是真正还能用的数,Active 与 Inactive 是上一期那两档,pgscan 涨得快、pgsteal 跟不上,就是系统一直在找可扔的页、却没找到多少。再看旋钮:

cat /proc/sys/vm/swappiness

默认 60,越大越偏向扔匿名页,越小越保程序内存、多扔文件页。

再给手头的推理服务也算一张同样的账,三个数就够:权重占多少显存,单个请求在稠密层上的 KV 占多少,并发上限就是剩下的显存除以单请求 KV。Cerebras 用 59 片晶圆算的,就是这道除法,缩到一张卡上照样能算。算完再决定:上下文预算是先卡死,还是等到回收池干了、系统开始直接回收时才变慢——前者是设计,后者是事故。

落到普遍场景,同一本账都能套。本地大模型服务上,权重和 KV cache 抢同一块显存,先算清单请求 KV,并发数就不再是拍脑袋;边缘小设备上,物理内存本来就小,工作集先按任务排好,回收池干之前就得有取舍;视频 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] Denning, P. J. The Working Set Model for Program Behavior. Communications of the ACM, 1968.
  4. [4] Bélády, L. A., Nelson, R. A., Shedler, G. S. An anomaly in space-time characteristics of certain programs running in a paging machine. Communications of the ACM, 1969.
  5. [5] Robert Love. Linux Kernel Development. Addison-Wesley, 2010.
  6. [6] 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
  7. [7] Kwon, W. et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP, 2023. https://arxiv.org/abs/2309.06180
  8. [8] Packer, C. et al. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560, 2023. https://arxiv.org/abs/2310.08560
  9. [9] Cerebras. How Cerebras Deploys Trillion-Parameter AI Models. Cerebras Blog, 2026. https://www.cerebras.ai/blog/how-we-deploy-trillion-parameter-frontier-models-on-cerebras
  10. [10] 孙过庭. 《书谱》. 垂拱三年(687).

· · ·

← 返回资讯中心