操作系统笔记:进程调度(Process Scheduling)
一、什么是进程调度
进程调度(Process Scheduling) 是操作系统中负责选择下一个要运行的进程的一项核心功能。在多道程序设计系统中,多个进程竞争CPU资源,调度器根据特定策略选择一个进程运行。
目标:
- 提高CPU利用率
- 提高系统吞吐量
- 减少平均等待时间
- 保证响应时间
- 实现公平性与优先级
二、调度类型
调度类型 | 说明 |
---|---|
长程调度(Long-term) | 决定哪些进程进入就绪队列 |
中程调度(Mid-term) | 暂停/恢复进程(换出/换入)以节省内存 |
短程调度(Short-term) | 选择哪个就绪进程获得CPU(核心调度器) |
实际中,主要关注短程调度,即CPU调度。
三、调度时机
进程调度的典型触发场景包括:
- 进程从运行状态 → 阻塞(如等待I/O)
- 进程从运行状态 → 就绪(时间片耗尽)
- 进程终止
- 优先级更高的进程进入就绪队列(抢占式调度)
四、调度方式:非抢占 vs 抢占
类型 | 描述 | 特点 |
---|---|---|
非抢占式 | 一旦CPU被分配,直到终止或阻塞 | 简单、安全,但响应差 |
抢占式 | 系统可中断当前运行进程调度他人 | 响应快,但复杂 |
五、常见调度算法(经典)
1. 先来先服务
- 按照进程到达时间先后执行
- 非抢占式
- 简单易实现,但容易造成长作业阻塞短作业
2. 短作业优先(SJF)
- 按预估CPU时间从短到长排序
- 非抢占式 or 抢占式(抢占版本称为最短剩余时间优先SRTF)
- 最优平均等待时间,但难以预知作业时间
3. 时间片轮转(RR)
- 所有进程轮流执行,每次限时(时间片)
- 抢占式,公平性强
- 时间片大小影响性能与响应(小 → 响应好,切换多)
4. 优先级调度
- 为每个进程分配优先级
- 可抢占式或非抢占式
- 可能导致饥饿(低优先级长期不运行)
- 可引入**老化机制(aging)**缓解饥饿
5. 多级队列调度(Multilevel Queue)
- 不同优先级进程分配到不同队列
- 每个队列使用不同算法(如前台RR,后台FCFS)
- 队列之间不可交互(静态)
6. 多级反馈队列调度(MFQ)
- 类似多级队列,但允许进程在不同队列间迁移
- 初始放高优先级队列,执行一次没完成则降级
- 老化机制内置,适应性强,是实际常用的复杂调度策略
六、调度算法比较
算法 | 平均等待时间 | 响应速度 | 公平性 | 实现复杂度 |
---|---|---|---|---|
FCFS | 一般偏高 | 差 | 差 | 简单 |
SJF | 最低 | 差 | 差 | 中 |
RR | 中等 | 好 | 好 | 中 |
优先级 | 不定(看策略) | 不定 | 差 | 中 |
多级反馈 | 好 | 好 | 好 | 复杂 |
七、重要调度指标
指标 | 含义 |
---|---|
周转时间 | 完成时间 - 提交时间 |
带权周转时间 | 周转时间 / 服务时间 |
等待时间 | 就绪队列中等待CPU的总时间 |
响应时间 | 第一次响应所花时间(用于交互式系统) |
八、进程调度相关术语回顾
- 进程控制块(PCB):记录进程状态、寄存器、优先级等调度所需信息
- 就绪队列:存放等待CPU的进程
- 上下文切换(Context Switch):保存/恢复进程执行状态的开销操作
九、面试常见问题及参考回答
为什么需要进程调度?
答: 因为系统资源有限,多个进程必须共享CPU等资源,调度器通过一定策略动态决定哪个进程运行,从而提升CPU利用率、响应时间和系统吞吐量。
非抢占式调度的缺点?
答:
- 无法强制切换,可能导致响应慢
- 一个进程运行时间过长会拖慢其他进程
- 不适用于交互式、实时系统
时间片轮转的优缺点?
答:
优点:
- 公平性强,每个进程都有机会
- 响应时间快,适合交互式系统
缺点:
- 时间片太大 → 类似FCFS,响应差
- 时间片太小 → 上下文切换频繁,浪费资源
多级反馈队列如何解决饥饿问题?
答:
- 低优先级进程若等待过久,将被提升优先级(老化机制)
- 动态调整进程优先级,确保所有进程都能运行
实际系统中常用哪些调度算法?
答:
- Windows:多级反馈队列 + 优先级提升/衰减机制
- Linux:O(1)调度器(老)、CFS(完全公平调度器)
- Unix:多级反馈 + 动态优先级
- Android:基于Linux CFS,并引入用户交互响应优化策略
十、总结
- 进程调度是操作系统资源管理核心之一
- 关键任务:选择最合适的进程运行,满足性能和公平
- 多种算法适用于不同场景,没有“最优算法”
- 面试重点:理解调度策略原理 + 实际适用性 + 面试题举例