操作系统|处理机调度三层体系 + 七状态模型
前面我们讲透了进程的五状态转换、线程的实现与模型。但系统里同时存在几十上百个进程,CPU 算力有限,该先让谁运行、该把谁暂时搁置,就需要「处理机调度」来统一管理。
调度不是只有 “选进程跑 CPU” 这一步,而是分为高级、中级、低级三层完整体系,对应进程从硬盘到内存、再到 CPU 的全流程。
一、处理机调度基本概念
定义:操作系统按照特定算法,从候选的进程 / 作业中选择一个,将 CPU 处理机资源分配给它,核心目标是兼顾公平性、系统效率与资源利用率。
类比: 把整个计算机系统比作一家公司:
- 外存(硬盘)= 外部简历人才池,人还没入职
- 内存 = 公司办公区,有正式工位,员工在公司待命
- CPU = 核心项目组,只有进入项目组才能真正干活执行
调度的本质,就是决定 “哪些人能入职、哪些人先居家待命、哪些人能进核心项目干活” 的整套规则。
二、调度的三个层次:从入职到分配项目
1. 高级调度(作业调度 )
定义
也叫作业调度,从外存的后备作业队列中挑选合适的作业,将其调入内存,并为其创建进程、分配初始资源。
1.调度对象:作业(外存中待运行的程序)
2.流向:外存 → 内存
3.核心作用:决定哪些作业有资格进入系统运行
类比
公司 HR 从外部简历池(外存)里筛选候选人,发 offer、办理入职手续,给员工分配工位(内存),让他成为公司正式员工(创建进程)。
核心特点
- 发生频率最低,几分钟、几小时甚至更久才执行一次;
- 一个作业只会被调入一次、调出一次,是程序进入系统的第一道门槛;
- 批处理系统中作用最突出,现代交互式系统(Windows、Linux 桌面)通常没有严格的高级调度。
真实例子
早期批处理系统中,用户提交的计算任务先全部存在磁带 / 硬盘里,操作员启动作业调度,选中的任务才会加载进内存运行。
2. 中级调度(内存调度 )
定义
也叫内存调度,为了缓解内存不足的压力、提升资源利用率,把内存中暂时不运行的进程调到外存 “挂起”;等内存有空余、进程具备运行条件时,再调回内存。
1.调度对象:进程
2.流向:外存 ↔ 内存(双向)
3.核心作用:在内存和外存之间做进程换入换出,也就是内存 “对换” 技术
类比
公司业务淡季、工位不够时,把暂时没项目的员工安排居家待命(挂起到外存),收回工位给更紧急的项目;等业务回暖、有空位了,再把员工召回公司上班(调回内存)。
核心特点
- 发生频率中等,根据内存占用情况动态执行;
- 可以多次换入换出,同一个进程可以被反复挂起、激活;
- 是虚拟内存、交换分区技术的底层逻辑之一。
真实例子
Windows 的虚拟内存、Linux 的 swap 交换分区,当物理内存不足时,系统会把长时间不活跃的进程数据换到硬盘上,腾出内存给前台程序,背后就是中级调度的思想。
3. 低级调度(进程调度 )
定义
也叫进程调度,从内存的就绪队列中挑选一个进程,将 CPU 资源分配给它,让它进入运行态执行指令。
1.调度对象:内存中的就绪进程
2.流向:内存 → CPU
3.核心作用:决定哪个进程能真正占用 CPU 执行,是操作系统最核心、最基础的调度
类比
部门主管从公司办公区待命的员工(就绪队列)里,挑选合适的人,分配到当前核心项目(CPU)上干活。
核心特点
- 发生频率最高,几毫秒就会执行一次,是操作系统最频繁的调度;
- 是所有多道程序系统的必备功能;
- 我们常说的时间片轮转、优先级调度、短作业优先等算法,都属于低级调度的具体算法。
真实例子
我们平时用电脑时,一边刷网页一边听歌一边挂微信,系统每隔几毫秒就切换一次进程,让多个程序 “同时运行”,这个切换决策就是低级调度完成的。
三、三层调度核心对比表
表格
| 调度层级 | 别名 | 调度对象 | 数据流向 | 发生频率 | 核心作用 |
|---|---|---|---|---|---|
| 高级调度 | 作业调度、长程调度 | 作业 | 外存 → 内存 | 最低 | 决定作业能否进入系统 |
| 中级调度 | 内存调度、中程调度 | 进程 | 外存 ↔ 内存 | 中等 | 内存不足时换出进程,缓解内存压力 |
| 低级调度 | 进程调度、短程调度 | 就绪进程 | 内存 → CPU | 最高 | 决定哪个进程占用 CPU 运行 |
四、进程七状态模型:挂起态的引入
1. 为什么要新增挂起态?
我们之前学的进程五状态模型(创建、就绪、运行、阻塞、终止),默认所有进程都在内存里。但实际系统中内存空间有限,进程太多会导致内存不足、系统卡顿。
引入中级调度后,进程可以被调到外存暂时存放,这种 “进程在外存、暂时不参与调度” 的状态,就叫挂起态。根据挂起前的状态,又细分为「就绪挂起」和「阻塞挂起」,五状态模型就扩展成了七状态模型。
2. 挂起态的两种细分
- 就绪挂起:进程在外存,只要调回内存就能立刻进入就绪态、等待 CPU
- 类比:员工居家待命,随时能干活,只要召回公司就能上岗
- 阻塞挂起:进程在外存,同时还在等待某个事件,就算调回内存也还是阻塞态
- 类比:员工在家一边待命一边等审批文件,就算回公司也得继续等文件
3.阻塞态与挂起态的区别
很多同学容易混淆这两个状态,核心区别只有一条:进程映像还在不在内存里。
- 阻塞态:进程还在内存中,只是在等待 I/O、信号等事件;事件一到,立刻就能变回就绪态,参与 CPU 调度。
- 类比:员工在公司工位上坐着,只是在等快递 / 审批,东西一到就能马上干活。
- 挂起态:进程已经被调出内存,数据放到外存里了;必须先经过 “激活” 调回内存,才能参与后续调度。
- 类比:员工已经回家了,公司连工位都收回了,必须先召回公司、分配工位,才能安排工作。
4. 七状态的核心转换逻辑
- 就绪态 → 就绪挂起:内存不足时,把就绪队列里优先级低、长时间不运行的进程挂到外存,腾出内存空间
- 阻塞态 → 阻塞挂起:内存不足时,本来就在阻塞等待的进程反正也跑不了,干脆挂到外存,优先腾内存给能运行的进程
- 就绪挂起 → 就绪态(激活):内存有空闲时,把就绪挂起的进程调回内存,重新加入就绪队列
- 阻塞挂起 → 阻塞态(激活):内存有空闲时,把阻塞挂起的进程调回内存,继续等待事件
- 阻塞挂起 → 就绪挂起:进程等待的事件发生了,阻塞挂起就变成就绪挂起;等后续激活回内存后,直接就是就绪态
- 运行态 → 就绪挂起:特殊场景下,正在运行的进程也可能被直接挂起,腾出内存给更紧急的进程
- 创建态-->就绪挂起:创建进程之后,可能由于内存不足而进入就绪挂起状态
五、总结
- 处理机调度分为三层:高级调度管 “作业能不能进内存”,中级调度管 “进程在内外存之间换入换出”,低级调度管 “哪个进程能上 CPU 运行”,频率从低到高。
- 挂起态的本质是进程被调出内存、放到外存,分为就绪挂起和阻塞挂起;和阻塞态的核心区别是 “是否还在内存中”。
- 七状态模型是五状态的扩展,完美匹配三层调度的完整流程,是内存资源紧张场景下的必然设计。