处理机调度
处理机调度
基本概念
调度对象
进程调度:在多道程序系统中,从就绪队列中选择一个进程分配 CPU。
线程调度:在多线程系统中,从就绪线程中选择一个线程分配 CPU。
调度时机
- 进程结束:当前进程执行完毕
- 时间片用完:分时系统中时间片耗尽
- 进程阻塞:进程等待 I/O 或其他资源
- 高优先级进程就绪:抢占式调度中高优先级进程到达
- 进程主动放弃 CPU:进程调用 yield()等函数
调度切换
上下文切换:从一个进程切换到另一个进程时,需要保存当前进程的状态并恢复新进程的状态。
切换开销:
- 保存和恢复寄存器
- 更新内存管理单元(MMU)
- 刷新缓存
- 更新内核数据结构
调度准则
面向用户的准则
-
周转时间:从进程提交到完成的时间
- 周转时间 = 完成时间 - 提交时间
- 平均周转时间 = Σ 周转时间 / 进程数
-
响应时间:从用户请求到系统响应的时间
- 响应时间 = 首次获得 CPU 时间 - 提交时间
-
等待时间:进程在就绪队列中等待的总时间
- 等待时间 = 周转时间 - 执行时间
-
截止时间:实时系统中进程必须完成的时间
面向系统的准则
-
CPU 利用率:CPU 忙碌时间的百分比
- CPU 利用率 = CPU 忙碌时间 / 总时间
-
吞吐量:单位时间内完成的进程数
- 吞吐量 = 完成的进程数 / 总时间
-
公平性:所有进程获得 CPU 的机会应该公平
-
可预测性:调度算法的行为应该可预测
调度方式
非抢占式调度
特点:
- 一旦进程获得 CPU,就一直执行到结束或阻塞
- 调度决策简单
- 响应时间不可预测
适用场景:
- 批处理系统
- 实时性要求不高的系统
抢占式调度
特点:
- 正在执行的进程可能被其他进程抢占
- 响应时间短
- 调度决策复杂
适用场景:
- 分时系统
- 实时系统
- 交互式系统
典型调度算法
1. 先来先服务(FCFS)
算法描述:
- 按照进程到达就绪队列的顺序进行调度
- 非抢占式调度算法
特点:
- 实现简单
- 公平性好
- 平均等待时间长
- 对短进程不利
示例:
进程 到达时间 执行时间 开始时间 完成时间 周转时间 等待时间
P1 0 6 0 6 6 0
P2 2 4 6 10 8 4
P3 4 2 10 12 8 6
P4 6 8 12 20 14 6
平均周转时间 = (6+8+8+14)/4 = 9
平均等待时间 = (0+4+6+6)/4 = 4
2. 短作业优先(SJF)
算法描述:
- 选择执行时间最短的进程优先执行
- 非抢占式版本:SJF
- 抢占式版本:最短剩余时间优先(SRTF)
特点:
- 平均周转时间最短
- 对长进程不公平
- 需要预知进程执行时间
示例:
进程 到达时间 执行时间 开始时间 完成时间 周转时间 等待时间
P1 0 6 0 6 6 0
P3 4 2 6 8 4 2
P2 2 4 8 12 10 6
P4 6 8 12 20 14 6
平均周转时间 = (6+4+10+14)/4 = 8.5
平均等待时间 = (0+2+6+6)/4 = 3.5
3. 时间片轮转(RR)
算法描述:
- 为每个进程分配一个时间片
- 进程用完时间片后,CPU 分配给下一个进程
- 抢占式调度算法
特点:
- 公平性好
- 响应时间短
- 时间片大小影响性能
时间片选择:
- 时间片太小:上下文切换开销大
- 时间片太大:退化为 FCFS
- 一般选择 10-100ms
示例(时间片=2):
时间 0 2 4 6 8 10 12 14 16 18 20
P1 |--|--|--|--|--|--|
P2 |--|--|--|--|--|--|
P3 |--|--|--|--|--|--|
P4 |--|--|--|--|--|--|
4. 优先级调度
算法描述:
- 为每个进程分配一个优先级
- 选择优先级最高的进程执行
- 可以是抢占式或非抢占式
优先级确定:
- 静态优先级:进程创建时确定,运行期间不变
- 动态优先级:根据进程行为动态调整
优先级调整策略:
- 等待时间越长,优先级越高
- CPU 使用时间越长,优先级越低
- I/O 密集型进程优先级高于 CPU 密集型进程
5. 多级反馈队列
算法描述:
- 设置多个优先级队列
- 新进程进入最高优先级队列
- 用完时间片后降级到下一级队列
- 低优先级队列时间片更长
特点:
- 结合了多种算法的优点
- 对短进程有利
- 长进程最终会得到执行
队列设置示例:
队列0:优先级最高,时间片1ms
队列1:优先级高,时间片2ms
队列2:优先级中,时间片4ms
队列3:优先级低,时间片8ms
队列4:优先级最低,时间片16ms
实时调度
实时系统特点
- 时间约束:任务必须在规定时间内完成
- 可预测性:系统行为必须可预测
- 可靠性:系统必须稳定可靠
实时调度算法
1. 最早截止时间优先(EDF):
- 选择截止时间最早的进程执行
- 动态优先级调度
- 理论上最优的实时调度算法
2. 速率单调调度(RMS):
- 周期任务的优先级与周期成反比
- 周期越短,优先级越高
- 静态优先级调度
3. 最小松弛时间优先(LLF):
- 选择松弛时间最小的进程执行
- 松弛时间 = 截止时间 - 当前时间 - 剩余执行时间
多处理器调度
调度策略
1. 全局调度:
- 所有 CPU 共享一个就绪队列
- 调度器为所有 CPU 选择进程
- 负载均衡效果好
2. 局部调度:
- 每个 CPU 有独立的就绪队列
- 进程绑定到特定 CPU
- 减少进程迁移开销
负载均衡
目标:使各 CPU 的负载尽可能均衡
策略:
- 工作窃取:空闲 CPU 从繁忙 CPU 窃取进程
- 负载迁移:将进程从繁忙 CPU 迁移到空闲 CPU
- 动态负载均衡:根据负载情况动态调整
调度性能评价
评价指标
- CPU 利用率:CPU 忙碌时间的百分比
- 吞吐量:单位时间内完成的进程数
- 周转时间:进程从提交到完成的时间
- 等待时间:进程在就绪队列中的等待时间
- 响应时间:从请求到响应的时间
性能比较
| 算法 | CPU 利用率 | 吞吐量 | 响应时间 | 公平性 |
|---|---|---|---|---|
| FCFS | 中等 | 中等 | 差 | 好 |
| SJF | 高 | 高 | 中等 | 差 |
| RR | 中等 | 中等 | 好 | 好 |
| 优先级 | 高 | 高 | 好 | 中等 |
| 多级反馈 | 高 | 高 | 好 | 好 |
术语对照表
| 中文术语 | 英文术语 | 缩写 | 说明 |
|---|---|---|---|
| 调度 | Scheduling | - | 选择进程/线程执行 |
| 调度算法 | Scheduling Algorithm | - | 调度的具体算法 |
| 先来先服务 | First Come First Served | FCFS | 按到达顺序调度 |
| 短作业优先 | Shortest Job First | SJF | 按运行时间调度 |
| 最短剩余时间优先 | Shortest Remaining Time First | SRTF | 抢占式SJF |
| 时间片轮转 | Round Robin | RR | 按时间片轮流调度 |
| 优先级调度 | Priority Scheduling | - | 按优先级调度 |
| 高响应比优先 | Highest Response Ratio Next | HRRN | 按响应比调度 |
| 多级队列 | Multilevel Queue | MLQ | 多个队列分别调度 |
| 多级反馈队列 | Multilevel Feedback Queue | MLFQ | 可动态调整的多级队列 |
| 抢占式 | Preemptive | - | 可抢占CPU的调度 |
| 非抢占式 | Non-Preemptive | - | 不可抢占的调度 |
| 周转时间 | Turnaround Time | - | 从提交到完成的时间 |
| 等待时间 | Waiting Time | - | 在就绪队列等待的时间 |
| 响应时间 | Response Time | - | 从提交到首次响应的时间 |
| 吞吐量 | Throughput | - | 单位时间完成的进程数 |
| CPU利用率 | CPU Utilization | - | CPU使用时间占比 |
| 时间片 | Time Quantum | - | RR算法的时间片大小 |
| 优先级反转 | Priority Inversion | - | 低优先级阻塞高优先级 |
| 优先级继承 | Priority Inheritance | - | 解决优先级反转的技术 |
| 饥饿 | Starvation | - | 进程长期得不到调度 |
| 老化 | Aging | - | 解决饥饿的技术 |
