进程调度
多个就绪进程争抢 CPU 时,由调度器决定"下一个轮到谁、运行多久"。调度算法直接决定系统是"响应飞快"还是"卡成幻灯片",是操作系统面试的必考点。
调度要追求什么
调度目标往往互相矛盾,需要根据系统类型权衡:
| 指标 | 含义 | 追求方向 |
|---|---|---|
| 吞吐量 | 单位时间完成的任务数 | 越大越好 |
| 周转时间 | 任务从提交到完成的总耗时 | 越短越好 |
| 等待时间 | 进程在就绪队列里等待的时间 | 越短越好 |
| 响应时间 | 交互场景下从输入到有反馈 | 越短越好 |
批处理系统重吞吐,桌面系统重响应,实时系统重截止时间——没有万能算法,只有匹配场景的算法。
经典调度算法(一):先来先服务与短作业优先
先来先服务(FCFS):按到达顺序排队,实现最简单。缺点是护航效应——一个大任务排在前面,后面所有短任务都被堵住干等。
短作业优先(SJF):谁预计运行时间短谁先执行,平均等待时间最优;但长任务可能长期得不到执行(饥饿),且运行时间往往无法预先得知,只适合理想情况。
举例(三个任务运行时间分别为 8、4、1 分钟,同时到达):
- FCFS:按 8→4→1 顺序,平均等待 = (0+8+12)/3 ≈ 6.7 分钟;
- SJF:按 1→4→8 顺序,平均等待 = (0+1+5)/3 = 2 分钟,明显更优。
经典调度算法(二):时间片轮转
时间片轮转(RR):就绪队列按 FCFS 排队,每个进程最多运行一个时间片(如 10ms),时间片用完就被抢占、排到队尾继续等。它是分时系统的基石,交互体验好:
就绪队列:[P1][P2][P3]
第 1 个时间片给 P1 → 队列变为 [P2][P3][P1]
第 2 个时间片给 P2 → 队列变为 [P3][P1][P2]
时间片太小则切换开销过大,太大则退化成 FCFS,需要权衡。
优先级调度与多级反馈队列
优先级调度:优先级高的先运行;低优先级可能饥饿,常用"老化"缓解——等待越久优先级逐渐提升。
多级反馈队列(MLFQ):综合方案。设置多级就绪队列,新进程进入最高优先级队列,时间片用尽即降级到下一级:
Q1(最高优先,时间片短):[新任务...]
Q2(时间片中等): [...
Q3(最低优先,时间片长):[...
短任务在高层快速完成,长任务降到底层也饿不死。现代操作系统(如 Linux 的 CFS)大体沿用了"动态优先级 + 公平调度"的思路。
调度时机与抢占
什么时候会发生调度切换?
- 进程主动让出 CPU:等待 I/O、调用 sleep/yield(非抢占式)。
- 时间片耗尽、更高优先级进程就绪(抢占式)。
- 进程结束或异常退出。
分时系统必须是抢占式的;Linux 默认抢占,其 CFS 按"虚拟运行时间"对所有进程公平排序,谁运行得少谁优先。
小结:调度就是回答"谁上 CPU、跑多久"。答题时按"算法思想 + 是否抢占 + 一个缺点 + 适用场景"四段式展开,把 FCFS、SJF、RR、MLFQ 讲清楚,即可覆盖绝大多数调度类面试题。