05 - 进程调度:谁先用 CPU
上一章说到,CPU 会在多个任务之间快速切换。那问题来了:时间片到了,下一个该轮到谁? 负责做这个决定的,是操作系统里的调度器(Scheduler)。它用的规则,就叫调度算法。
这章不背算法名词,只讲清楚「调度到底在权衡什么」。
调度器要摆平的矛盾
想象你是医院的分诊台,同时来了一堆病人(任务):
- 有的很急(正在等你输入的交互程序,慢一秒你就骂卡);
- 有的很耗时(后台压缩一个大文件,要跑好几分钟);
- 有的很短(一个小脚本,几毫秒就完事)。
你不可能让所有人都满意。调度器要在几个目标之间权衡:
- 响应快:让人机交互的任务尽快得到反应(别让用户觉得卡)。
- 吞吐高:单位时间内干完的活尽量多。
- 公平:别让某个任务饿死(永远排不上队)。
这几个目标常常互相打架,所以没有「完美」的调度算法,只有「适合场景」的。
几种最基本的思路(理解即可)
1. 先来先服务(FCFS) 排队,谁先来谁先用,用完为止。
- 优点:公平、简单。
- 缺点:万一排在最前面的是个「跑 10 分钟」的大任务,后面一堆「几毫秒」的小任务全被堵死。(银行里前面一个人办复杂业务,后面急着交个话费的全得干等。)
2. 短任务优先(SJF) 让预计耗时最短的先跑。
- 优点:整体等待时间最短,效率高。
- 缺点:得预知任务要跑多久(现实中很难);而且大任务可能永远被小任务插队,饿死。
3. 时间片轮转(Round Robin) 就是上一章讲的:每人给一个固定时间片,轮流来,用完没干完就排到队尾。
- 优点:公平,响应快,没人被饿死。
- 缺点:时间片大小不好定——太大就退化成「先来先服务」,太小又切换太频繁浪费在交接上。
4. 优先级调度 给任务分等级,高优先级的先跑。
- 键盘、鼠标这类交互任务给高优先级(保证不卡);后台任务给低优先级。
- 缺点:低优先级任务可能一直被高优先级插队饿死。(解决办法:让等太久的任务优先级慢慢升高,这叫「老化」。)
真实系统怎么做
现实中的操作系统(如 Linux)用的是综合的、动态调整的策略:把任务分成不同优先级,交互型任务优先级高、响应快,计算型任务优先级低但保证能跑;还会根据任务的实际表现动态调整。你不用记具体算法名字,记住这句就够:
调度的本质,是在「响应快、效率高、公平不饿死」之间做权衡,并根据任务类型区别对待。
小结
- 调度器决定时间片到了之后 CPU 交给谁,用的规则叫调度算法。
- 调度要在三个常常打架的目标间权衡:响应快、吞吐高、公平。
- 基本思路:先来先服务(简单但会堵)、短任务优先(高效但会饿死大任务)、时间片轮转(公平、响应好)、优先级调度(区别对待,但要防饿死)。
- 真实系统用的是「分优先级 + 动态调整」的综合策略,核心是区别对待不同类型的任务。
下一章 → 06 - 多个线程一起改数据会出乱子 | 回到 README 目录