1 什么是任务调度?操作系统为什么需要它?
任务调度是决定哪个任务在何时使用CPU的过程。因为CPU核心数量远少于需要运行的任务(进程/线程)数,需要通过调度来公平、高效地分配计算资源,实现多任务并发/并行的假象,并满足不同任务(如交互式、计算密集型)的需求。
调度通常在三种场景下发生:
- 进程从运行态变为等待态(如 I/O 等待)
- 进程主动放弃 CPU(如执行完毕)
- 定时中断发生(抢占式调度)
2 任务调度的层次与场景
- 高级调度(作业调度):决定将外存(磁盘)上的哪个“作业”调入内存,准备执行。它控制着内存中并发进程的数量。
场景:大型机或批处理系统 - 中级调度(内存调度):为了解决内存紧张问题,将暂时不运行的进程调出到外存(挂起),在适当的时候再调回内存。这实际上是“进程”在就绪/挂起状态之间的切换。
场景:现代通用操作系统 - 低级调度(进程/线程调度):决定就绪队列中的哪个进程/线程获得CPU的使用权。这是最频繁、最精细的调度,由操作系统的 调度器 和分派器 完成。
场景:所有操作系统的核心,也是最常讨论的调度。
注:我们通常所说的“任务调度原理”主要指的就是低级调度。
3 常见的调度算法
-
先来先服务:按照任务到达就绪队列的顺序进行调度。
实现简单,公平。但平均等待时间可能很长,对短任务不友好(“护航效应”)。 -
最短作业优先:优先调度预计运行时间最短的任务。
可以最小化平均等待时间。但可能导致长任务永远得不到执行(饥饿)。需要预知任务的运行时间,这在实际中很难。 -
优先级调度:每个任务被赋予一个优先级,调度器总是选择优先级最高的任务运行。
- 静态优先级:优先级在任务创建时确定,不变。
- 动态优先级:优先级在运行时根据情况(如等待时间、已使用CPU时间)动态调整,可以防止低优先级任务饥饿。
-
时间片轮转调度:为每个任务分配一个固定的时间片。任务运行一个时间片后,被剥夺CPU并放回就绪队列的末尾。
非常公平,能保证所有任务都得到响应。时间片大小的选择是关键:- 太大 → 退化为FCFS。
- 太小 → 上下文切换开销过大,系统效率低。
-
多级反馈队列调度:设立多个优先级队列,高优先级队列时间片小。新任务进入最高级队列。任务用完时间片未完成则降级;任务因I/O而放弃CPU则可能升级或留在原队列。调度时,先运行高优先级队列,空后才运行低一级队列。
优点:能同时兼顾多种类型任务——短任务能快速完成(响应快),I/O密集型任务能保持高优先级,长计算型任务虽然后台运行但也能得到服务。
总结一下:
| 调度算法 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| 先来先服务(FCFS) | 按到达顺序执行 | 简单 | 等待时间长,响应慢 |
| 最短作业优先(SJF) | 优先执行执行时间最短的任务 | 平均等待时间最短 | 需预知执行时间,不公平 |
| 最短剩余时间优先(SRTF) | SJF 的抢占版 | 响应快 | 调度频繁,开销大 |
| 时间片轮转(RR) | 每个任务分配固定时间片 | 公平、响应快 | 上下文切换频繁 |
| 优先级调度(Priority) | 按优先级调度 | 灵活 | 可能饥饿(低优先级长期不执行) |
| 多级反馈队列(MLFQ) | 动态调整优先级与时间片 | 综合性好,常用 | 实现复杂 |
4 抢占式调度和非抢占式调度的区别
- 抢占式:操作系统可以强制中断当前运行的任务,将CPU分配给更重要的任务。例如,一个时间片用完后被中断。例子:现代通用操作系统(Windows, Linux, macOS)的调度。
- 非抢占式:任务一旦开始运行,就会一直占用CPU直到它主动放弃(如完成、等待I/O)。例子:一些早期的批处理系统或某些实时操作系统。
4 什么是上下文切换?为什么它是有开销的?
当 CPU 从执行一个任务(进程或线程)切换到另一个任务 时,操作系统必须:
- 保存当前任务的 运行状态(也就是“上下文”)
- 再恢复另一个任务之前保存的 上下文状态
这个过程就叫 上下文切换(Context Switch)。
它的开销主要来自:
- 需要保存和恢复寄存器、程序计数器等状态;
- 会导致 CPU 缓存(Cache)和 TLB (页表缓存)失效;
- 调度器本身的选择过程也需要时间。
5 如何减少上下文切换?
- 合理设置线程数量,避免过多竞争 CPU;
- 使用协程、异步 I/O;
- 降低锁竞争;
- 提高任务粒度,减少频繁调度;
- 使用 CPU 绑定(CPU affinity)优化缓存命中。
6 什么是进程、线程?它们的调度有何区别?
- 进程:系统资源分配的最小单位;有独立地址空间。
- 线程:CPU 调度的最小单位;共享进程的资源。
- 区别:
- 进程切换需要切页表(开销大)
- 线程切换只需保存寄存器和栈(开销小)
7 实时操作系统(RTOS)和普通操作系统在调度上的区别?
- 普通 OS:追求平均性能、公平性;
- RTOS:追求确定性、可预测性;
通常使用 优先级抢占式调度,保证高优先级任务在规定时间内执行。