第65期 | 进程到底是什么?

操作系统 · · 九羲科技

第五章收束。前面十一期,我们把"进程"拆了一遍:一次调用两次返回、写时才复印、先复印再换魂、僵尸、fork 炸弹、一份表格、一把旋钮、两次 fork 的断舍离、不复印直接借、爹没了归 init 收养、投胎换骨。今天收个尾,只回答一个问题——进程,到底是什么?

一、进程到底是什么

第五章的答案:内核眼里,进程从来不是"正在跑的程序"这么浪漫的东西。它是一份表格(PCB),加一片地址空间,加一串关系(爹是谁、孩子是谁、开了哪些文件)。fork 干的事,就是把这三样原样复印一份,再给个新名字(PID)。

1974 年的 UNIX 论文里,fork、exec、wait、exit 四个原语被写进了 CACM¹——"进程"从此有了论文级的定义。当时的复印是"全文复印":地址空间不过几十 KB,复印不心疼。贵是从什么时候开始的?地址空间越来越大,复印越来越疼,疼到卡内基梅隆的 Mach 在 1980 年代把"写时复制"做进虚拟内存²:先不复印,只改页表做个记号,谁写了谁再复印——"写时才复印",第 55 期的标题,就是 Mach 那帮人当年想出来的懒办法。

所以,进程是什么?三句话:它是内核给"一段计算"办的身份证(PCB);fork 是复印身份证加身体;exec 是换身体不换身份证。僵尸是"死了没人收尸"(第 57 期),孤儿是"爹没了归 init 收养"(第 63 期),守护进程是"两次 fork 切断一切关系"(第 61 期),vfork 是"穷到连复印都省了,直接借"(第 62 期)。一章的答案,收成一句话:进程,是计算的拟人化封装——内核把一段计算,当成"一个人"来管:有名字、有身体、有爹妈、有生死。

好奇心多问一层:为什么是"复印",不是"新建"?1970 年代的答案很实在——复印最简单,不用发明"怎么从零造一个进程"。整个 Unix 的哲学都在这儿:不发明新原理,只把老原理拆成趁手的形状。发展性研究之眼:fork 不是原理突破,是工程选择。原理(分时、保护)1969 到 1974 年早成熟了,赢在"先实际后原理"。

二、智能体是流,不是复印机

fork 默认了一个没人问过的前提——"复制一段计算"是便宜的。1974 年成立:地址空间几十 KB,复印一下午都不心疼。今天呢?一个智能体的"身体"是几十 GB 的权重、KV cache、向量记忆,"复印"贵到没人敢——于是有了常驻推理服务、热加载、LoRA 切换,全是绕着"复印太贵"打的补丁。

更深的一层:进程的生死是离散事件——fork 出生,exit 死亡,中间跑的是顺序指令流。智能体不是。智能体的"运行"是持续的注意力流:记忆在线、意图在线、上下文在线。"启动"是个动词,不是名词——没有 exec 那一瞬间的换骨,只有意图的连续流转。

路已经有人在走了:MemGPT 把操作系统用了几十年的内存分级思想,直接借去管大模型的上下文³——context 即内存,中断即控制流。内存管理那一章的页表,在推理引擎里复活成了 PagedAttention⁴;进程管理这一章的 fork,大概会在"智能体快照与迁移"里复活:不是复印整个身体,而是流转意图包——要办的事、已知的上下文、办成的标准、办砸的退路。

照见一层平时看不见的:谁在为 fork 的"复印假设"买单?1974 年买单的是小内存——复印便宜,皆大欢喜;2026 年买单的,是每一个想"复制一个智能体"的团队——要么忍受冷启动,要么自己造轮子做状态迁移。旧抽象的账,迟到了五十年才寄到。

范式之眼:进程抽象是为顺序指令流设计的——"一个正在执行的程序"。AI 时代的主体,是向量阵列上的持续计算,是流,不是程序。这条线,第 61 章收束。

三、今晚,养一只僵尸进程

手边任何一台 Linux 机器,三分钟,看"死了没人收"的现场:

python3 -c "import os,time; p=os.fork(); os._exit(0) if p==0 else time.sleep(30)" &

另一个终端跑 ps -o pid,stat,cmd -p 子进程PID——STAT 那一栏是个 Z,僵尸本尸。再看 ps -o pid,ppid,stat,cmd -p 1:PID 1(init 或 systemd)的工作之一,就是替孤儿收尸——第 63 期的"收养",现场验证。

再看 fork 炸弹的保险丝:ulimit -u,每个用户能 fork 的进程数上限。第 58 期的十三个字符,撞的就是这条线。

strace 看 shell 的日常:strace -f -e trace=clone,clone3,wait4 sh -c 'sleep 0.1 & wait'。每敲一个后台命令,都是一次 fork(今天叫 clone)加一次 wait。1974 年的原语,2026 年的 shell 还在用,一字没改。

落到实践:如果你在维护长期运行的服务(推理服务、网关、定时任务),"脚本启动业务进程"的结构,结尾都值得一个 exec(第 64 期);PID 1 选 tini 或 systemd 这样的收尸人(第 63 期);ulimit -u 按并发数设上限(第 58 期)。进程管理这章的十一期,合起来就是一份长期运行服务的进程树检查清单:谁 fork、谁收尸、谁换骨、谁限额。不发明新原语,只把 1974 年的老原语摆成趁手的形状——这就是"把原理变成能跑的东西",发展性研究的长相。

觉 然 小 注

「如来说:世界,非世界,是名世界。」⁵(思想化用)

所谓进程,即非进程,是名进程。名相是假名安立:复印的是名分(PID),换的是骨(地址空间),留的是关系(爹是谁、文件开着)。破了"进程"这个相,才能看见计算本身——一段流,一次意图,一场不断的生灭。

引 用 与 出 处

  1. [1] D. M. Ritchie & K. Thompson. The UNIX Time-Sharing System. Communications of the ACM, 1974. https://doi.org/10.1145/361011.361061
  2. [2] M. Accetta, R. Baron, W. Bolosky, D. Golub, R. Rashid, A. Tevanian & M. Young. Mach: A New Kernel Foundation for UNIX Development. USENIX Summer Conference, 1986.(写时复制做进虚拟内存,fork 自此"写时才复印")
  3. [3] C. Packer et al. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560, 2023. https://arxiv.org/abs/2310.08560
  4. [4] W. Kwon et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP, 2023. https://arxiv.org/abs/2309.06180
  5. [5] 《金刚般若波罗蜜经》第十三分,鸠摩罗什译:「如来说:世界,非世界,是名世界。」(思想化用)

· · ·

← 返回资讯中心