进程调度算法
操作系统通过进程调度算法决定哪个就绪进程获得CPU使用权,以实现多任务高效执行。以下是核心算法详解:
一、先来先服务(FCFS)
1. 是什么?
按进程到达就绪队列的顺序分配CPU,非抢占式(进程主动释放CPU前不中断)。
2. 解决什么问题
提供基础公平性,避免调度逻辑复杂化。
3. 应用场景
批处理系统(如后台报表生成)。
4. 重要注意事项
- 护航效应(Convoy Effect):长进程阻塞短进程,导致平均等待时间过长。
- 示例:进程A(10ms)、B(1ms)依次到达,B需等待10ms才能执行。
二、最短作业优先(SJF)
1. 是什么?
优先调度预估执行时间最短的进程,分抢占式(SRTF)和非抢占式。
2. 解决什么问题
最小化平均等待时间,提升系统吞吐量。
3. 应用场景
批处理任务(如科学计算)。
4. 重要注意事项
- 长进程饥饿:持续短进程到达时,长进程可能永远无法执行。
- 需预知进程执行时间(实际中依赖历史数据预测)。
三、优先级调度(Priority Scheduling)
1. 是什么?
为进程分配优先级(数值越小优先级越高),调度高优先级进程。
2. 解决什么问题
处理紧急任务(如系统守护进程)。
3. 应用场景
实时系统(如航空控制系统)。
4. 重要注意事项
- 低优先级饥饿:通过老化(Aging) 动态提升等待进程优先级。
- Java线程优先级示例(不保证跨平台一致):java
Thread thread = new Thread(() -> System.out.println("High Priority")); thread.setPriority(Thread.MAX_PRIORITY); // 优先级=10 thread.start();
四、时间片轮转(RR, Round Robin)
1. 是什么?
为每个进程分配固定时间片(如20ms),时间片用完则重新排队。
2. 解决什么问题
平衡响应时间与公平性,避免进程垄断CPU。
3. 应用场景
交互式系统(如Web服务器)。
4. 重要注意事项
- 时间片大小:过长→退化为FCFS;过短→上下文切换开销大。
- 示例:4个进程(时间片=5ms)的调度:
五、多级反馈队列(MFQ)
1. 是什么?
设置多优先级队列,新进程入最高优先级队列;未完成则降级至低优先级队列。
2. 解决什么问题
平衡短作业响应速度与长作业完成保证。
3. 应用场景
通用操作系统(如Linux/Windows)。
4. 重要注意事项
- 高优先级队列:时间片短(如10ms),适合交互式进程。
- 低优先级队列:时间片长(如50ms),适合后台计算。
关键区别总结
算法 | 抢占性 | 优化目标 | 缺点 |
---|---|---|---|
FCFS | 否 | 公平性 | 护航效应 |
SJF | 可选 | 平均等待时间最短 | 长进程饥饿 |
优先级调度 | 可选 | 紧急任务响应 | 低优先级饥饿 |
RR | 是 | 响应时间均衡 | 时间片选择敏感 |
多级反馈队列 | 是 | 综合性能最优 | 实现复杂度高 |
总结
- FCFS/SJF:适合可预测任务的批处理系统。
- RR:核心用于交互式系统(如用户界面)。
- 优先级/MFQ:适用混合负载场景(如服务器+后台任务)。
🔔 Java注意:
Thread.setPriority()
仅建议JVM调度,实际依赖操作系统实现。开发中应通过Lock
、CompletableFuture
等API控制执行顺序,而非依赖调度算法。