第59期 | 内核眼里,进程只是一份表格

操作系统 · · 九羲科技

一、内核眼里,进程只是一份表格

Linux 0.01 的 include/linux/sched.h,第 77 行起,struct task_struct¹——这就是 1991 年内核眼里"进程"的全部模样。内核里没有"进程"这种东西,只有一份份填好的表格,和一个叫 current 的指针,指着正被执行的那一份。

这份表分几栏。身份栏:pid、father、pgrp、session、leader,外加 uid、euid、suid 与 gid 一家——你是谁、你爹是谁、你跟谁一伙、穿几号马甲,全在这几行。状态栏:state(-1 不可运行,0 可运行,大于 0 是停住)、counter、priority——调度器只看这几栏,不关心你的代码写了什么。记账栏:utime、stime 记你在用户态和内核态各花了多少时间,cutime、cstime 记你子孙花的,start_time 记出生年月,alarm 是你定的闹钟。家当栏:pwd、root 记你站在哪个目录,filp[20] 是你开着的 20 个文件描述符。身体栏:ldt[3]、tss——x86 切换进程时,CPU 要搬进搬出的那套寄存器现场。

妙处在于,fork 做的事不过是把这份表复印一份(第 54、55 期讲过)。"进程"一词的全部工程含义,就藏在这张表里。

今天的 task_struct 长成了几 KB 的庞然大物(64 位上一般 2–4KB 量级²)、几百个字段,可骨架还是 1991 年那套:身份、状态、记账、家当、身体。一个结构管了三十多年,没换过设计语言。

Ritchie 与 Thompson 1974 年那篇论文³讲的是进程的"映像"(image)——代码、数据、栈三段,还没给进程"画过像"。档案这份表,是后来的工程发明:原理(分时、多进程)早有了,把它变成能跑、能记账、能调度的东西,靠的是发展性研究这一层。

维纳在《控制论》里讲"感知—比较—执行"的回路⁴(思想化用)。调度器就是这条回路:读 state 与 counter(感知),挑 counter 最大的(比较),切过去跑(执行),跑完回写 utime(反馈)。task_struct 就是回路里的那张比较表。

孙过庭《书谱》有一句:"真以点画为形质,使转为情性"⁵(思想化用)。点画是静的形质,使转是动的情性。task_struct 是点画——静的、写满的;调度器是使转——动的、翻页的。字好不好看不在点画,在使转;系统活不活,也不在这张表,在表被翻动的下一刻。

二、智能体的身份证该长什么样

如果 AI 的操作系统先出现,它没有 pid,但它一定需要同样的"一份表"。agent 在系统眼里,应该是一份身份证:

身份栏——谁派生的它、归属哪棵任务树、代谁行事;状态栏——运行中、等工具返回、被暂停、已结算;预算栏——token 额度还剩多少、还能再派生几个子 agent;记忆栏——上下文窗口的指针、向量库的句柄、对话沉淀的仓库地址;权限栏——能调哪些工具、能读哪些数据、能不能联网。

AIOS 那篇论文⁶构想的 LLM 内核,管的就是 agent 调度与上下文管理——本质上,是在给智能体造 task_struct。今天的多智能体框架,大多把这些信息散在日志和各处内存里,系统"看不见"agent。看不见就管不了:派生失控了不知道(第 58 期的 fork 炸弹),账单爆了才发现。

往深看一层:第 58 期说过,fork 炸弹耗的从来不是算力,是记账能力。AI 时代也一样——真正稀缺的不是算力,是"谁派生了谁、花了多少、什么时候停"这套账。一份表,就是记账的起点。

三、读一份进程的"体检报告"

手边任何一台 Linux 机器都能试。今晚花五分钟,亲手读一份 task_struct 的翻译件:

cat /proc/self/status

/proc 就是内核把这张表翻成的人话:Name 是进程名,State 是 state 那一栏的翻译(R/S/D/Z/T),Pid、PPid 对应 pid 与 father,Uid 那一行是 uid/euid/suid/gid 一家,VmPeak/VmSize 是内存账本。逐行对照着看,第 ① 节那张表立刻有了手感。

再做两个对照小实验:`ps -o pid,ppid,stat,etime,cmd -p $$` 看当前 shell 的几栏;`sleep 100 &` 挂起一个进程,`cat /proc/$!/status | grep State` 看到 S,再 `kill -STOP $!` 看到 T——亲手把 state 那一栏拨来拨去。

映射到普遍场景:今天做多智能体编排的团队,调试时习惯先看日志、再猜状态。建议反过来:给每个 agent 建一份进程表——id、父任务、状态、token 账本、工具权限清单,先看表,再看日志。表是静的,却是所有动态行为的锚。把成熟的进程记账思想,工程化到 agent 这个新对象上——原理早熟了,缺的是做进去的那一层工程。

觉 然 小 注

「凡所有相,皆是虚妄。若见诸相非相,则见如来。」⁷ task_struct 写满了相——pid、状态、记账,可调度器真正信的只有几行。档案是死的,翻档案的手是活的。别把表,当成进程本身。

引 用 与 出 处

  1. [1] Linux 0.01 源码历史归档. include/linux/sched.h(struct task_struct 第 77–105 行,NR_TASKS=64), 1991. https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/
  2. [2] asepsayyad007. Linux Has Thousands of Processes. How Does It Keep Track of Them? dev.to.(task_struct 在 64 位架构上一般占 2–4KB 内核 slab 内存) https://dev.to/asepsayyad007/linux-has-thousands-of-processes-how-does-it-keep-track-of-them-2l89
  3. [3] Ritchie, D. M.; Thompson, K. The UNIX Time-Sharing System. Communications of the ACM, 1974. https://doi.org/10.1145/361011.361061
  4. [4] Wiener, N. Cybernetics: Or Control and Communication in the Animal and the Machine. MIT Press, 1948.(思想化用:调度器作为"感知—比较—执行"回路)
  5. [5] 孙过庭. 《书谱》. 垂拱三年(687).(思想化用:"真以点画为形质,使转为情性")
  6. [6] Mei et al. AIOS: LLM Agent Operating System. arXiv:2403.16971, 2024.
  7. [7] 鸠摩罗什译. 《金刚般若波罗蜜经》.("凡所有相,皆是虚妄。若见诸相非相,则见如来。")

· · ·

← 返回资讯中心