✅常见的进程调度算法有哪些?

✅常见的进程调度算法有哪些?

典型回答

在操作系统中,进程调度算法决定了 CPU 如何分配时间片给不同的进程。

✅什么是时间片

常见的调度算法有以下几个:

先来先服务(FCFS, First Come First Served)

顾名思义,就是谁先来谁就有限获得CPU资源,类似排队买票,先来的进程先执行,后来的进程要等前面的执行完。

这个算法的优点就是公平,先来后到。缺点就是可能存在“长进程”影响后续进程,形成“短进程饥饿”现象。

短作业优先(SJF, Shortest Job First)

顾名思义,就短谁优先。分为非抢占式(进程一旦被选中,就会执行完)和抢占式(如果有更短的进程到来,会打断当前进程)

优点是可以最小化平均等待时间和周转时间(理论上最优)。缺点就是如何准确的预测谁的执行时间更短呢?另外就是长任务可能就一直拿不到时间片了。

优先级调度(Priority Scheduling)

为每个进程分配优先级,优先调度高优先级进程。同样分为抢占式和非抢占式。

优点就是如果某些任务真的很重要,可以给他加权,让他更快执行。缺点就是有些优先级低的进程可能就拿不到时间片了。

时间片轮转(RR, Round Robin)

这个简单,就是每个进程分配固定时间片(如 100ms),时间片用完则抢占并放入队列尾部,循环执行。

优点就是也挺公平的,大家顺序来,每个进程都能执行到,不会出现饥饿的情况,但是可能会导致CPU时间片的频繁切换。导致额外的消耗。

多级反馈队列(MLFQ, Multi-Level Feedback Queue)

进程根据执行时间和优先级被分配到不同队列,新进程进入最高优先级队列(时间片短),若进程用完时间片未结束,则降级到低优先级队列(时间片变长)。低优先级队列长时间未运行可升级优先级(防止饥饿)。

优点是可以兼顾短任务和长任务,提高系统响应速度。还能防止饥饿问题。唯一的缺点就是实现复杂度高,难以实现和优化。

完全公平调度(CFS, Completely Fair Scheduler)

基于虚拟运行时间(vruntime)分配 CPU,确保所有进程按权重公平获得执行时间。使用红黑树(Red-Black Tree)快速选择最小 vruntime 的进程。(现代 Linux 系统的默认调度器。)

优点是高公平性,低延迟,适合多任务混合负载。缺点是对实时任务支持需额外配置(如配合实时调度类)。

算法 抢占性 优点 缺点 适用场景
FCFS 非抢占 简单、公平 短进程饥饿 早期批处理系统
SJF/SRTF 非抢占/抢占 理论最优平均等待时间 依赖预知时间,长作业饥饿 已知时长的批处理任务
RR 抢占 公平,响应快 上下文切换开销 交互式系统(如分时 OS)
优先级调度 可选抢占 灵活定制优先级 低优先级进程饥饿 实时系统
多级反馈队列(MLFQ) 抢占 自适应,平衡长短作业 实现复杂 通用操作系统
CFS 抢占 高公平性,低延迟 实时任务需额外配置 现代 Linux 系统