进程调度是操作系统核心功能之一,指按一定策略从就绪队列中选择进程并分配CPU资源的过程。其核心目标是提高系统效率、响应速度和资源利用率。
2. 调度层次
- 高级调度(作业调度):决定哪些作业载入内存进入就绪状态。
- 中级调度(内存调度):管理进程的换入/换出,平衡内存与CPU资源。
- 低级调度(CPU调度):实际分配CPU给就绪进程,是最频繁的调度操作。
二、进程调度目标
目标类型 | 具体指标 | 适用场景 |
---|---|---|
公平性 | 避免进程饥饿,均衡分配资源 | 多用户系统 |
效率 | CPU利用率(尽量接近100%) | 服务器系统 |
响应速度 | 缩短平均响应时间 | 交互式系统(如桌面OS) |
吞吐量 | 单位时间完成进程数 | 批处理系统 |
周转时间 | 进程从提交到完成的总时间 | 批处理任务 |
三、调度算法分类及原理
1. 非抢占式算法(进程一旦获得CPU则运行至结束)
-
先来先服务(FCFS)
- 原理:按就绪顺序分配CPU,先到先执行。
- 示例:若进程A(运行5s)先就绪,进程B(运行3s)后就绪,则总周转时间为5+(5+3)=13s。
- 缺点:长进程会导致短进程等待时间过长(“ convoy effect”)。
-
短作业优先(SJF)
- 原理:优先选择运行时间最短的进程。
- 优点:理论上可最小化平均周转时间。
- 缺点:需预知进程运行时间,可能导致长进程饥饿。
2. 抢占式算法(可强制剥夺CPU资源)
-
时间片轮转(RR)
- 原理:为每个进程分配固定时间片(如10ms),超时则切换至下一个进程。
- 关键:时间片过短会增加切换开销,过长则退化为FCFS。
- 适用:交互式系统(如Windows、Linux桌面)。
-
优先级调度
- 原理:按进程优先级(静态/动态)分配CPU,高优先级进程优先执行。
- 动态优先级:进程等待时间越长,优先级越高(避免饥饿)。
-
最高响应比优先(HRRN)
- 公式:响应比 =(等待时间+运行时间)/ 运行时间
- 特点:兼顾短进程(运行时间短)和长等待进程(等待时间长)。
3. 实时调度算法
- 硬实时调度:必须严格满足截止时间(如航天器控制),常用“最早截止时间优先(EDF)”。
- 软实时调度:允许偶尔超时(如视频播放),常用“速率单调调度(RMS)”。
四、调度实现机制
1. 进程切换过程
- 保存当前进程上下文(寄存器、PC值等)至PCB(进程控制块)。
- 更新进程状态(从运行→就绪/阻塞)。
- 选择下一个运行进程。
- 恢复新进程的上下文并加载至CPU。
2. 关键数据结构
- 就绪队列:存放就绪进程的链表/数组。
- PCB:记录进程状态、优先级、运行时间等信息。
五、实际系统中的调度(以Linux为例)
- CFS(完全公平调度器)
- 核心:基于“虚拟运行时间”分配CPU,优先级高的进程虚拟时间增长慢,获得更多运行机会。
- 优势:兼顾公平性与效率,适用于多任务环境。
六、总结
- 调度算法无“最优解”,需根据场景选择(如实时系统用EDF,交互式系统用RR)。
- 现代OS多采用混合策略(如Linux CFS结合优先级与公平性)。
脑图结构(核心框架)
## **进程调度基础**
- 定义:CPU资源分配策略
- 调度层次:高级/中级/低级
- 核心目标:公平/效率/响应速度
## **调度算法**
- 非抢占式
- FCFS
- SJF
- 抢占式
- RR
- 优先级调度
- HRRN
- 实时调度
- EDF
- RMS
## **实现与应用**
- 进程切换流程
- Linux CFS调度器
1 研究背景
进程调度(Process Scheduling)是操作系统内核最核心的子系统之一,它直接决定 CPU 利用率、系统响应时间、吞吐量和功耗表现。随着多核、众核、异构计算、容器与云原生的普及,调度器的设计目标从单纯“最大化 CPU 利用率”扩展到“兼顾公平、能耗、实时性、安全与可观测性”。
2 关键概念速查
• 进程 vs 线程 vs 任务:Linux 把可调度实体称为 task;用户态常说“进程/线程”。
• 调度类(Scheduling Class):Linux 用 modular 方式实现多种策略,如 CFS、RT、DL、Idle、Stop。
• 调度策略(Policy):SCHED_OTHER、SCHED_FIFO、SCHED_RR、SCHED_DEADLINE、SCHED_BATCH、SCHED_IDLE。
• 优先级:静态优先级(nice)、动态优先级(prio)、实时优先级(0-99)、deadline 参数(runtime/deadline/period)。
• CPU 拓扑:SMT、NUMA、Die、Cluster、大小核(big.LITTLE)。
• 抢占:自愿(yield)、用户抢占、内核抢占(CONFIG_PREEMPT)、完全抢占实时补丁(PREEMPT_RT)。
3 主流算法与评价维度
3.1 单核经典算法
FCFS、SJF、SRTF、RR、优先级、多级反馈队列(MLFQ)。
3.2 多核算法
• 全局 vs 分区 vs 混合
• 负载均衡(load balance)
• 能耗感知(Energy Aware Scheduling,EAS)
• NUMA 迁移
3.3 实时算法
• 固定优先级:RM、DM
• 动态优先级:EDF、LLF
• 多核实时:G-EDF、P-EDF、C-EDF、RUN、LITMUS^RT
3.4 评价维度
CPU 利用率、响应时间、周转时间、公平性、实时可调度性、功耗、抖动、上下文切换开销、锁竞争。
4 Linux 调度器演进史
1.2 → 2.4(O(n))→ 2.6(O(1))→ CFS(2.6.23,2007)→ RT/DL → EAS → SCHED_EXT(BPF 调度器,2023)。
CFS:基于红黑树,虚拟运行时间 vruntime;RT:bitmap + 双队列;DL:Earliest Deadline First + 带宽控制;EAS:Energy Model + 小核优先;SCHED_EXT:用户空间可编程调度器。
5 云原生与容器场景
• cgroups CPU 子系统:cpu.shares、cpu.cfs_quota_us、cpu.rt_runtime_us。
• Kubernetes:CPU request/limits → CFS quota;实时容器可用 CPU Manager + Topology Manager。
• Serverless:burst & idle 场景,冷启动导致调度延迟敏感。
• 多租户:公平性 vs 噪声邻居,需要 BPF 调度器或 cgroup v2 的 latency nice。
6 嵌入式与异构计算
• Android:Uclamp、walt、EAS、SCHED_FIFO 音频线程。
• 自动驾驶:PREEMPT_RT + SCHED_DEADLINE 保证 1 ms 控制环。
• RISC-V:Linux 已支持 Sstc(Supervisor-mode timer)以降低 timer 中断开销。
• GPU/TPU:NUMA-aware 线程绑核,减少 PCIe 延迟。
7 性能观测与调试工具
• /proc//sched*、/proc/sched_debug
• perf sched、perf c2c、perf timechart
• trace-cmd & kernelshark、ftrace、ebpf sched_* 跟踪点
• BPF 工具:runqlat、runqlen、cpudist、offcputime
• LISA、Kernelshark、Intel VTune、Arm Streamline。
8 未来趋势
• 用户空间可编程调度器(SCHED_EXT + BPF)
• CXL 内存语义对调度器的影响
• RISC-V 与 chiplets 的异构调度
• AI 辅助调度(Meta 的 Autoscale、Google 的 ML-Scheduler)
• 实时 Linux 主线化(PREEMPT_RT 预计在 6.12 完全合并)
────────────────
二、思维导图(脑图)
────────────────
(文本版,可直接粘到 XMind、MindManager 或 draw.io 导入为 Markdown)
进程调度
1 基础概念
- 进程/线程/任务
- 状态:R,S,D,T,Z,X,I
- 上下文:寄存器、内核栈、mm、files
2 调度目标
- 性能:吞吐、CPU 利用率
- 交互:响应时间、延迟分布
- 公平:CFS shares、组调度
- 实时:deadline 保证
- 能耗:EAS、DVFS
- 安全:侧信道隔离
3 经典算法
- 单核
- FCFS / SJF / SRTF
- RR / 优先级 / MLFQ
- 多核
- 全局 / 分区 / 混合
- 负载均衡 / 迁移
- NUMA / 大小核
- 实时
- 固定优先级:RM / DM
- 动态优先级:EDF / LLF
4 Linux 调度器
- 1.2 - 2.4:O(n)
- 2.6:O(1) → CFS
- RT / DL / IDLE / STOP
- EAS:Energy Model + sugov
- SCHED_EXT:BPF 可编程
5 云原生
- cgroups CPU 子系统
- K8s:request/limit → CFS quota
- CPU Manager / Topology Manager
- Serverless / 冷启动
6 嵌入式 & 异构
- Android:walt / uclamp
- PREEMPT_RT / SCHED_DEADLINE
- RISC-V / chiplets / GPU
7 观测工具
- /proc/sched*
- perf / ftrace / BPF
- LISA / VTune / Streamline
8 未来趋势
- SCHED_EXT + BPF
- CXL / chiplet NUMA
- AI 调度器
- PREEMPT_RT 主线化
────────────────
使用方法
- 复制“思维导图”区块文本 → 打开 XMind → 文件 → 导入 → Markdown → 自动生成脑图。
- 如需 PDF 或 PNG,可在 XMind 中导出。
在操作系统中,进程调度是核心功能之一,它负责合理地分配 CPU 资源,以提高系统的性能和效率。本报告将详细介绍进程调度的相关内容,包括调度方式、三级调度、调度算法以及进程优先级的确定。
二、调度方式
(一)可剥夺式调度
可剥夺式调度是指当有更高优先级的进程到来时,强行将正在运行进程的 CPU 分配给高优先级的进程。这种调度方式能够及时响应高优先级进程的需求,保证系统的实时性。例如,在一个多任务操作系统中,当一个紧急的实时任务到达时,可以立即剥夺当前正在运行的低优先级进程的 CPU 资源,从而确保实时任务能够及时执行。
(二)不可剥夺式调度
不可剥夺式调度是指当有更高优先级的进程到来时,必须等待正在运行进程自动释放占用的 CPU,然后将 CPU 分配给高优先级的进程。这种调度方式相对简单,实现成本较低,但可能会导致高优先级进程等待时间过长,影响系统的实时性。例如,在一些对实时性要求不高的系统中,为了减少调度开销,可以采用不可剥夺式调度方式。
三、三级调度
在某些操作系统中,一个作业从提交到完成需要经历高、中、低三级调度。
(一)高级调度
高级调度也称为作业调度,它主要负责从外存的作业后备队列中选择作业进入内存,并为其分配必要的资源,建立相应的进程。高级调度的主要目的是根据系统的资源状况和作业的需求,合理地选择作业进入内存,以提高系统的资源利用率和吞吐量。
(二)中级调度
中级调度也称为内存调度,它的主要任务是在内存和外存之间进行进程的对换。当内存资源紧张时,中级调度会将一些暂时不需要运行的进程换出到外存,以腾出内存空间;当内存资源充足时,再将一些进程从外存换入到内存,使其能够继续运行。中级调度的主要目的是提高内存的利用率,平衡系统的负载。
(三)低级调度
低级调度也称为进程调度,它负责从就绪队列中选择一个进程,并将 CPU 分配给该进程,使其能够在 CPU 上运行。低级调度是最频繁的调度,它直接影响到系统的性能和响应时间。
四、调度算法
(一)先来先服务(FCFS)算法
先来先服务算法是一种最简单的调度算法,它按照进程到达的先后顺序依次为进程分配 CPU 资源。该算法的优点是公平、简单,实现起来比较容易;缺点是平均等待时间可能较长,尤其是当长作业先到达时,会导致后面的短作业等待时间过长。
(二)时间片轮转(RR)算法
时间片轮转算法是一种用于分时系统的调度算法,它将 CPU 时间划分成固定大小的时间片,每个进程在获得 CPU 资源后,只能运行一个时间片,当时间片用完后,该进程将被暂停,并被插入到就绪队列的末尾,等待下一次调度。该算法的优点是能够保证每个进程都能在一定时间内得到响应,实现了公平性和及时性的平衡;缺点是时间片的大小选择比较困难,如果时间片过大,算法会退化为先来先服务算法;如果时间片过小,会增加调度开销。
(三)优先级调度算法
优先级调度算法是根据进程的优先级来分配 CPU 资源的算法,优先级高的进程将优先获得 CPU 资源。优先级可以分为静态优先级和动态优先级,静态优先级是在进程创建时就确定的,而动态优先级则会根据进程的运行情况动态调整。该算法的优点是能够根据进程的重要性和紧急程度合理分配 CPU 资源,提高系统的性能和效率;缺点是可能会导致低优先级进程饥饿,即长时间得不到 CPU 资源。
(四)多级反馈调度算法
多级反馈调度算法是一种综合了多种调度算法优点的调度算法,它设置了多个不同优先级的就绪队列,并为每个队列分配不同的时间片。新进程首先进入最高优先级队列,按照先来先服务的原则进行调度;如果该进程在一个时间片内没有完成,则将其移动到下一级队列;依此类推,直到该进程进入最低优先级队列,在最低优先级队列中采用时间片轮转算法进行调度。该算法的优点是能够适应不同类型进程的需求,提高系统的性能和效率;缺点是实现起来比较复杂。
五、进程优先级确定
(一)I/O 型进程
对于 I/O 型进程,让其进入最高优先级队列,以及时响应需要 I/O 交互的进程。通常执行一个小的时间片,在该时间片内要求可处理完一次 I/O 请求的数据,然后转入到阻塞队列。这样可以保证 I/O 型进程能够及时得到处理,提高系统的 I/O 性能。
(二)计算型进程
对于计算型进程,每次都执行完时间片后进入更低级队列。最终采用最大时间片来执行,以减少调度次数。这样可以减少计算型进程的调度开销,提高系统的 CPU 利用率。
(三)I/O 次数不多,主要是 CPU 处理的进程
对于 I/O 次数不多,主要是 CPU 处理的进程,在 I/O 完成后,返回优先 I/O 请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。这样可以避免该类进程频繁地在高优先级队列和低优先级队列之间切换,提高系统的稳定性。
(四)适应进程不同时间段的运行特点
为适应一个进程在不同时间段的运行特点,I/O 完成时,提高优先级;时间片用完时,降低优先级。这样可以根据进程的实际运行情况动态调整其优先级,提高系统的性能和效率。
六、总结
进程调度是操作系统中的重要功能,它直接影响到系统的性能和效率。通过合理选择调度方式、调度算法以及确定进程优先级,可以提高系统的资源利用率、吞吐量和实时性。在实际应用中,需要根据系统的特点和需求,综合考虑各种因素,选择合适的调度策略。