Skip to content

进程调度算法

操作系统通过进程调度算法决定哪个就绪进程获得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响应时间均衡时间片选择敏感
多级反馈队列综合性能最优实现复杂度高

总结

  1. FCFS/SJF:适合可预测任务的批处理系统。
  2. RR:核心用于交互式系统(如用户界面)。
  3. 优先级/MFQ:适用混合负载场景(如服务器+后台任务)。

🔔 Java注意Thread.setPriority()仅建议JVM调度,实际依赖操作系统实现。开发中应通过LockCompletableFuture等API控制执行顺序,而非依赖调度算法。