✅常见的进程调度算法有哪些?
典型回答
在操作系统中,进程调度算法决定了 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 系统 |