第66期 | 时间,是怎么被切成片的

操作系统 · · 九羲科技

第六章开篇。前面五章,我们把"进程"从出生讲到收尸:一次调用两次返回、写时才复印、僵尸、孤儿、守护进程。今天起,新的一章——调度器。切口是:从 O(1) 到 CFS,"公平"是怎么算出来的。开篇不急着讲算法,先问一个更老的问题:时间,是怎么被切成片的?

一、时间,是怎么被切成片的

1959 年 6 月,巴黎。UNESCO 第一届信息处理大会上,Christopher Strachey 宣读了一篇论文,题目叫《Time Sharing in Large Fast Computers》¹。他设想的画面,今天看很朴素:一个程序员坐在电传打字机前面调程序,而计算机里,同时还跑着另一个程序。

朴素,但当时是离经叛道。1959 年的计算机是批处理:一次一个作业,排队等,机器的时间是整块出租的。Strachey 干的事,就是把"整块的时间"切成片——论文里他把分片复用的技术难题一条条列出来,给出解法。同年 2 月,他已经在英国为"分时"申请了专利。MIT 计算中心 1963 年把这篇论文记为"第一篇分时计算机论文"。

两年后,纸上谈兵落地。1961 年 11 月,MIT 的 Fernando Corbató 在一台 IBM 709 上演示了 Experimental Time-Sharing System²:四台打字机,四个用户,一台机器假装同时陪四个人。1962 年 5 月 3 日,Corbató 和 Daggett、Daley 在春季联合计算机会议上发表论文,CTSS 从 1964 年起生产运行,一跑十年。

好奇心多问一层:Strachey 1984 年还专门提过,time-sharing 这个词的意思变了,让他很困扰——他 1959 年说的重点不是"多人交互",而是"把机器时间切开复用"。一个词,二十五年,意思漂移了一整个维度。术语,也是有为法。

连回 Linux:1991 年 Linus 写 0.01,调度器就是最简时间片——第 32 期讲过的 counter,"谁的 counter 大,谁先跑"。从 1959 年巴黎那篇论文,到 1991 年赫尔辛基的学生宿舍,三十二年,调度器回答的始终是同一个问题:下一个跑谁,跑多久。

但"切时间片"藏着一个没人问过的前提:片,凭什么一样大?切多碎合适?2002 年 1 月 4 日,Ingo Molnar 给 LKML 写了一封长邮件,标题是《Goals, Design and Implementation of the new ultra-scalable O(1) scheduler》³——开篇就很不客气,大意是:你是不是也受够了 recalculation loop 把 L1 cache 冲掉?goodness loop 在进程多的时候是不是越跑越慢?2.4 内核的 O(n) 调度器,成了它要调度的进程们的瓶颈。五年后,2007 年 10 月,Linux 2.6.23,同一个 Molnar 合入了 CFS⁴:不要时间片了,要 vruntime——"公平"这个词,被重新定义了一遍。从 O(1) 到 CFS,本章往下细讲。

发展性研究之眼:分时是原理突破(1959),O(1) 和 CFS 是发展性研究——原理早成熟了,赢在把"公平"工程化。Brooks 1987 年那篇著名的泼冷水文章早就写过判词⁵:软件的困难分两种,本质困难(概念本身的复杂度)和偶然困难(工具、表示带来的摩擦)。O(1) 消灭的是偶然困难——算法复杂度从 O(n) 降到 O(1);"公平"本身是本质困难,定义一变,算法就得重写。从 O(1) 到 CFS,不是算法变聪明了,是"公平"的定义变了。没有银弹,只有 trade-off。

二、不切时间片,切算力份额

如果 AI 的操作系统先出现,调度会被设计成什么样?旧调度切的是时间——因为旧算力是顺序指令流,时间是唯一的度量衡,一块 CPU 一次只能干一件事,不切时间没法分。

AI 时代的算力是向量阵列:GPU 上成千上万个线程同时开火,"时间片"这把刀切不动它。推演一步:调度的单位,会从"时间片"变成"算力份额"。任务不再排队等 CPU,而是向调度器声明:我要多少 SM、多少显存带宽、时延 SLO 是多少。调度器不再是轮流坐庄的裁判,而是算力拍卖的做市商——价高者得是最低级的玩法,更可能是"意图定价":救命的推理请求,自动获得最高出价权。

再深一层:智能体的"运行"不是离散的时间片,是持续的注意力流。调度的真正对象,可能是"上下文"本身——哪些记忆常驻显存(热),哪些换出去(冷),就是新时代的"换页"。苗头已经在了:PagedAttention 把操作系统用了几十年的分页思想,直接借去管大模型的 KV cache⁶。内存管理那章的页表在推理引擎里复活了,调度器这一章的"公平",大概会在"上下文调度"里复活:vruntime 的下一代,可能是 vmemtime——虚拟记忆时间。

照见平时看不见的一层:谁在为"时间片"这个旧假设买单?今天每一个在 GPU 上跑多租户推理的团队,都在付这笔账——时间片调度器不懂"KV cache 换出再换入有多贵",切一次,预热一次,钱就烧一次。旧抽象的账单,这次寄得很快。

三、亲眼看见公平是怎么算的

手边任何一台 Linux 机器,两个死循环,nice 值不同,top 里看"公平"现场:

nice -n 0 sh -c 'while :; do :; done' &

nice -n 10 sh -c 'while :; do :; done' &

top 看 %CPU:大约 9 比 1。不是一人一半——CFS 的公平是按权重分的:nice 0 权重 1024,nice 10 权重 110。1024 对 110,约等于 9 比 1。"完全公平",公平的是权重,不是人头。

再看 vruntime 本人:cat /proc/<PID>/sched | grep vruntime。权重低的那个进程,vruntime 涨得飞快——CFS 的规矩只有一条:永远挑 vruntime 最小的跑,"谁欠账多谁先上"。一条命令,"公平是怎么算出来的",看穿。

落到普遍场景:企业私有智能中心里,多个智能体任务抢同一块 GPU,怎么排?对话任务要低时延,批量任务要吞吐——和 CFS 当年面对的是同一个问题:给每个任务定权重,按权重分算力,再给时延敏感的留"抢占"的口子。调度器六十年没换过问题,只换了算账的单位。

觉 然 小 注

「是法平等,无有高下。」⁷(思想化用)

公平不是一样多,是各得其所。调度器从不回答"谁更重要"——它只负责把"重要"翻译成数字,再把数字分均匀。翻译权,才是调度器真正的权力。

引 用 与 出 处

  1. [1] C. Strachey. Time Sharing in Large Fast Computers. Proceedings of the First UNESCO International Conference on Information Processing, Paris, 1959.(1959 年 2 月英国专利申请在先;据 MIT Computation Center 1963 年记述,为"第一篇分时计算机论文")
  2. [2] F. J. Corbató, M. M. Daggett & R. C. Daley. An Experimental Time-Sharing System. Proceedings of the AFIPS Spring Joint Computer Conference, 1962.(1961 年 11 月于 MIT IBM 709 首次演示;CTSS 1964–1974 年生产运行)
  3. [3] I. Molnar. Goals, Design and Implementation of the new ultra-scalable O(1) scheduler. 致 LKML 邮件,2002-01-04;收录于 Linux 内核源码 Documentation/sched-design.txt(2.6 内核)
  4. [4] I. Molnar. CFS Scheduler. Linux 内核文档 Documentation/scheduler/sched-design-CFS.txt;合入 Linux 2.6.23,2007-10. https://www.kernel.org/doc/html/latest/scheduler/sched-design-CFS.html
  5. [5] F. P. Brooks Jr. No Silver Bullet — Essence and Accidents of Software Engineering. IEEE Computer, 20(4): 10–19, 1987. https://doi.org/10.1109/MC.1987.1663532
  6. [6] W. Kwon et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP, 2023. https://arxiv.org/abs/2309.06180
  7. [7] 《金刚般若波罗蜜经》第二十三品,鸠摩罗什译:「是法平等,无有高下。」(思想化用)

· · ·

← 返回资讯中心