进程调度

多个就绪进程争抢 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)大体沿用了"动态优先级 + 公平调度"的思路。

调度时机与抢占

什么时候会发生调度切换?

  1. 进程主动让出 CPU:等待 I/O、调用 sleep/yield(非抢占式)。
  2. 时间片耗尽、更高优先级进程就绪(抢占式)。
  3. 进程结束或异常退出。

分时系统必须是抢占式的;Linux 默认抢占,其 CFS 按"虚拟运行时间"对所有进程公平排序,谁运行得少谁优先。

小结:调度就是回答"谁上 CPU、跑多久"。答题时按"算法思想 + 是否抢占 + 一个缺点 + 适用场景"四段式展开,把 FCFS、SJF、RR、MLFQ 讲清楚,即可覆盖绝大多数调度类面试题。

笔记加载中…