操作系统是刻意不持有目标的复用器,agent 是持有目标的代理人。前者的美德是中立和隐形——一个对你的程序有意见的操作系统是个坏操作系统;后者要是没意见就没用。所以管道能搬,设计哲学是反的:所有借来的机制底下坐着一个性质与那个传统相反的部件。
展开几条我觉得最要紧的。
机制与策略被焊死了。 OS 设计的立教之本就是机制与策略分离——内核给机制、策略外放,从 Hydra 到微内核到 exokernel 到 sched_ext 都是这一条。模型把两者不可分地熔在权重里。想换 Linux 的调度策略,写个 BPF 程序;想换 agent 的"策略",只能写英文然后祈祷,或者重新训练。这就是写提示词的手感完全不像系统编程的原因:你不是在配置一个机制,你是在跟一个熔铸体谈判。
没有代码与数据的分离。 这条最狠,而且恰好是前面聊的那种"重新发现"发现不了的。OS 花了几十年用页权限、W^X、NX 位把代码和数据隔开,那是冯诺依曼架构原罪的补救。LLM 的底层根本不允许这个区分——每个 token 同时是指令和数据。prompt injection 就是这件事的后果,而它没有"参数化查询"那种修法,因为没有语法可供分离。从这个角度看,agent 是台前 W^X 时代的机器。
信任关系是倒的。 OS 里边界在内核(可信)与进程(不可信)之间,由硬件强制,MMU 不可能被说服。agent 系统里最有能力的部件恰好是最不可信的那个,边界必须画在它外面,而它同时还是决定下一步做什么的那个。用 OS 的话说:进程在写调度器。这也是为什么真正的权限检查只能放在 harness 里——放在提示词里的东西没有强制力,只是规范。
fail-stop 是一种馈赠。 OS 的故障是响的:segfault、panic、ENOSPC。整个容错传统建立在"故障可被检测"之上,所以恢复才可解。agent 的默认故障安静且看起来完全正常。最接近的经典框架是拜占庭容错,但 BFT 贵(3f+1 副本),而且假定你能对相同输出投票——你没法对散文投票。再加上不可复现(采样、上下文漂移、GPU 上连 temp 0 都不严格确定),OS 那套"复现、最小化、二分"的调试传统整体不迁移;替代品是分布层面的统计评估,那更像检验一条生产线或一款药,不像调一个程序。
并发模型退回 1995 年以前。 OS 靠时钟中断无条件抢占。agent 没有这个东西:抢占只能发生在语义边界上,且需要被抢占方配合——这就是协作式多任务,操作系统这行 1995 年就放弃了它,因为一个不老实的任务能拖死整台机器。harness 的超时是硬杀,不是抢占后可恢复。
资源不可通约。 OS 管的周期和字节便宜、可测、可互换:1GB 内存就是 1GB。agent 里稀缺的是上下文,但十万 token 的好上下文和十万 token 的噪声完全不是一回事,而且判断力会随上下文变长而退化,从外部还观测不到。OS 从来不需要处理"进程用的内存越多就变得越笨"。
往实用层面收一下:OS 传统里值得偷的是那些编码了约束、而不是编码了假设的部分——隔离、资源记账、故障隔离、按能力的最小权限,并且必须实现在模型之外才有强制力。不能偷的是一切依赖确定性、类型化接口、可读策略的东西。还有一件 agent 需要而 OS 传统从没建过的东西:一个能判定"这次操作是否真的做了它声称的事"的验证器——内核从不怀疑 syscall,而这又绕回前面 RSI 那个瓶颈。整条线上最缺的,一直是同一样东西。