CPU调度层次、算法、时机与方式及Idle进程全解析
笔记哥 /
04-10 /
10点赞 /
0评论 /
349阅读
# 简介
当CPU有大量任务要处理,但由于资源有限,无法同时处理。所有就需要`某种规则`来决定任务处理的顺序,这就是调度。
# 调度层次
根据调度频率与层次,共分为三种
1. 高级调度
也称为作业调度(Long-Trem Scheduling),频次很低,它决定哪些进程从`外存(硬盘)加载到内存`
2. 中级调度
也称为内存调度(Medium-Term Scheduing),频次中等,将暂时无法运行的进程(阻塞进程)交换到外存,也就是所谓的挂起。释放内存资源,后续再重新加载到内存中。
3. 低级调度
也称为进程调度(Short-Term Scheduing),频次极高,每秒可达数千次。它直接决定当前哪个就绪进程获得CPU。
| ---- | 做什么? | 发生在哪? | 频率 | 对进程的影响 |
| --- | --- | --- | --- | --- |
| 高级调度 | 选择合适的作业调入内存,并创建进程 | 外存=>内存 | 最低 | NULL=>初始态=>就绪态 |
| 中级调度 | 从阻塞队列中选择合适的进程调回内存 | 外存=>内存 | 中等 | 阻塞态=>就绪态 |
| 低级调度 | 从就绪队列中选择合适的进程配合CPU | 内存=>CPU | 极高 | 就绪态=>运行态 |
## 进程调度的模型

相对进程的状态模型,这里出现了两种新状态,就绪挂起和阻塞挂起。
这本质上是一种优化,比如进程进入了就绪态/阻塞态。但该进程优先级很低,CPU根本调度不到该进程,该进程还白白占用内存,那不如将它挂起,从内存移入外存。释放内存为更高优先级的进程服务。
>
>
> 比如你的屏保程序,是CPU完全没事干的时候,才会运行。如果一直占用内存,只会白白浪费。
>
### 眼见为实

# 常见调度算法
调度算法的选择直接影响系统性能,常见算法为`抢占式`(直接中断)和`非抢占式`(进程自愿释放)
1. 先来先服务(First-Come First-Served,FCFS)
按照进程进入就绪队列的顺序分配CPU,先到先得。
优点:实现简单,公平性基于到达顺序
缺点:可能导致"护航消息",短CPU时间的进程要等待长CPU进程执行完成,周转性较差
2. 短作业优先(Shortest Job First,SJF)
选择预计执行最短的进程优先运行。
优点:平均周转时间最小化
缺点:需要预知运行时间,实现很难。谁家好人算这个啊!
3. 轮转法(Round Robin,RR)
为每个进程分配固定的时间片(比如15ms),进程时间片用完后,返回就绪队列。
优点:保证程序快速响应,适合交互式系统
缺点:上下文切换频繁,降低系统性能
4. 优先级调度(Priority Scheduling)
为每个进程分配优先级,高优先级先执行。
分为静态优先级:进程创建时即确定好优先级,动态优先级:根据运行情况动态调整优先级
优点:按需运行,高优先级进程能占用大量CPU。
缺点:低优先级进程可能一直得不到调用。动态设置优先级时,优先级难以界定。
5. 多级反馈队列(Multilevel Feedback Queues)
设置多个优先级队列,比如按照时间片的长短分组。新进程首先进入高优先级队列,如果未在时间片内完成,则降级到下一级队列
# 进程调度时机与方式
## 什么时候需要进程调度?
1. 主动放弃
- 进程正常终止
- 运行过程中发生异常而终止
- 主动阻塞,比如等待I/O,Sleep
2. 被动放弃
- 分配的时间片用完
- 更高优先级进程的插入,比如I/O中断
## 什么时候不能进程调度?
1. 处理中断的过程
2. 进程处于操作系统内核临界区
3. 系统原语操作过程
>
>
> 说人话就时,当系统执行原子操作时,就不能调度。
>
> 你都是原子操作了,要是能被调度,那还叫原子操作吗?
>
## 进程调度方式
1. 抢占式
由操作系统剥夺当前进程的CPU使用权
2. 非抢占式
进程主动放弃CPU,全凭良心。
## 进程调度程序
1. 支持内核级线程的操作系统,调度的对象是线程
2. 不支持内核级线程的操作系统,调度的对象是进程
## Idle进程
CPU通电后,就需要一直运行。就算没有工作,也要给CPU几条指令,组成一个循环,在那里`空转`。
因此系统会创建这么一个特殊的`Idle进程`。
从它的工作性质不难猜出它的特性:
1. 优先级最低
2. 能耗低
3. 啥也不干
### 眼见为实

本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2154
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利