进程调度的基本过程总结
前言
在现代操作系统中,同一台计算机可以同时运行大量应用程序,给用户造成“多个程序同时在CPU上并行运行”的错觉。但在单核CPU场景下,同一时刻CPU只能执行一条指令,只能运行一个进程。实现多程序“同时运行”的核心机制就是进程调度。本文基于计算机底层原理,梳理进程调度完整过程、相关概念与工作逻辑。
前置概念回顾:
- 进程:操作系统对正在运行程序的抽象,是程序的一次运行实例,也是操作系统资源分配的基本单位。
- PCB(进程控制块):操作系统用来描述、管理进程的数据结构,保存进程PID、程序信息、占用资源、调度状态等全部信息;操作系统通过PCB链表/树结构管理系统中所有进程。
- 单核CPU:同一时间只能执行一个进程的指令,依靠时间片轮转,让多个进程交替使用CPU。
一、进程的基础状态
在调度发生前后,进程会处于不同状态,常见三种基础状态:
- 就绪状态:进程一切准备就绪,只等待分配CPU时间,一旦获得CPU就可以立刻执行。
- 运行状态:进程正在CPU上执行指令。
- 阻塞(等待)状态:进程不具备运行条件,需要等待外部事件(等待IO读取数据、等待网络响应、等待信号),此时就算给到CPU也无法执行。
状态流转:
- 就绪 → 运行:调度器选中该进程,分配CPU时间片。
- 运行 → 就绪:时间片用完,或者有更高优先级进程抢占CPU。
- 运行 → 阻塞:进程主动等待IO、等待其他资源,主动让出CPU。
- 阻塞 → 就绪:等待事件完成,进程唤醒,回到就绪队列等待CPU。
二、进程调度的参与角色
- 进程控制块PCB
每一个进程对应一个PCB实例,保存进程ID、上下文(CPU寄存器、PC程序计数器、ALU状态)、内存资源、打开文件、调度优先级等信息。
进程上下文:进程被切出CPU时,必须把CPU寄存器、PC等现场保存到PCB;当进程再次被调度执行,把上下文恢复回CPU寄存器,进程就可以从上次中断位置继续执行。这是进程切换的核心。
-
就绪队列
操作系统维护就绪队列,存放所有处于就绪状态的进程PCB。调度算法就是从就绪队列挑选下一个要上CPU运行的进程。 -
调度器(Scheduler)
操作系统内核模块,负责调度决策:按照调度算法,从就绪队列选出合适进程,执行进程切换。 -
CPU硬件
CPU执行进程指令;时间中断硬件会触发时钟中断,通知操作系统:当前进程时间片耗尽,需要触发调度。
三、进程调度完整基本过程
1. 调度时机(什么时候会发生调度)
触发调度的典型场景:
- 时间片耗尽:时钟硬件发出中断,当前正在运行进程的时间片用完。当前进程从「运行」变为「就绪」,放回就绪队列,触发调度。
- 进程主动放弃CPU:进程发起IO操作(读磁盘、读网络),进入阻塞状态;进程会让出CPU,调度器选择新进程运行。
- 阻塞进程被唤醒:等待的IO完成,阻塞进程变为就绪;若新唤醒进程优先级高于当前运行进程,触发抢占调度。
- 新建/终止进程:新进程创建完成进入就绪队列;进程执行结束退出,需要挑选其他进程运行。
2. 保存上下文(进程切出)
当正在CPU运行的进程需要让出CPU:
- 将CPU现场全部保存到该进程对应的PCB:PC程序计数器、通用寄存器、ALU标志位、各种寄存器的值。
- PC的值记录该进程下一条要执行的指令地址,保证进程下次被调度时,可以接着之前的位置继续运行。
- 修改进程状态:如果是时间片用完,状态改为就绪;如果等待IO,状态改为阻塞。放回对应队列。
💡 关键点:CPU本身不会记住进程状态,所有进程运行现场,全部保存在内存里的PCB结构中。
3. 调度算法选择下一个进程
调度器运行调度算法,遍历就绪队列,按照策略选出下一个要运行的进程。
常见调度策略:
- 时间片轮转:就绪队列轮流分配时间片;
- 优先级调度:优先选择高优先级进程;
- 抢占式调度:高优先级进程到来,可以强行剥夺当前进程CPU。
4. 恢复上下文(进程切入)
选中目标进程之后:
- 从该进程PCB中读取保存好的上下文数据;
- 将寄存器、PC程序计数器、标志位等重新写回CPU硬件;
- 修改进程状态为运行状态;
- CPU从PC指向的地址开始执行该进程的机器指令。
5. CPU执行进程指令
CPU按照取码‑解码‑执行的指令周期,不断执行该进程机器指令,直到下一次调度时机到来,重复上面流程。
四、时间片与并发假象
单核CPU下,多个进程不是真正同时运行。
操作系统把CPU时间切分成非常细小的时间片(毫秒级别)。进程轮流占用CPU,快速切换。
切换速度远快于人感知,给用户造成“多个程序同时运行”的并发假象。
注意:
- 真正并行:多核CPU,多个核心上同时跑多个进程;
- 并发:单核CPU依靠调度切换,宏观同时,微观串行。
五、进程调度与内存调度的区别
| 资源 | 分配模式 | 说明 |
|---|---|---|
| CPU | 时间模式 | 多个进程分时复用同一块CPU;同一时刻只能一个进程运行,靠调度切换 |
| 内存 | 空间模式 | 给不同进程分配内存不同物理空间;进程拥有独立内存空间,互相隔离 |
六、进程调度带来的开销
进程调度不是无成本的:
- 上下文切换开销:保存寄存器、恢复寄存器、访问内存PCB结构,消耗CPU时间。频繁调度会降低系统整体性能。
- 队列维护开销:操作系统维护就绪队列、阻塞队列,PCB增删改查带来开销。
所以操作系统需要设计调度算法,在响应速度和调度开销之间做权衡。
七、总结
- 进程调度是操作系统核心功能,目的是在有限CPU硬件上,让多个进程能够交替使用CPU资源。
- PCB保存进程全部运行上下文,上下文保存与恢复是进程切换的核心。
- 调度流程:触发调度时机 → 保存旧进程上下文 → 调度算法选新进程 → 恢复新进程上下文 → CPU执行新进程。
- 单核依靠时间片快速切换制造并发假象;调度本身会带来上下文切换开销。
- CPU资源是时间维度分配;内存资源是空间维度分配。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)