916 字
2 分钟
OS笔记(六):调度的概念、层次
OS笔记(六):调度的概念、层次
本文是操作系统笔记系列的第六篇,详细讲解操作系统调度的三个层次(高级调度、中级调度、低级调度)以及七状态模型。
📚 目录
一、什么是调度?
1.1 调度的定义
调度(Scheduling)是操作系统按照某种策略从多个可执行的候选中选择一个来使用某种资源的过程。
1.2 为什么需要调度?
- CPU资源有限,进程数量多
- 需要决定哪个进程获得CPU
- 需要平衡公平性和效率
二、调度的三个层次
2.1 高级调度(作业调度)
作业:一个具体的任务(用户提交的工作单位)。
高级调度:按一定原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。
| 特点 | 说明 |
|---|---|
| 频率 | 每个作业只调入一次,调出一次 |
| 操作 | 调入时建立PCB,调出时撤销PCB |
| 目标 | 控制内存中的进程数量 |
### 2.2 中级调度(内存调度)
**挂起状态**:内存不够时,将某些进程的数据调到外存等待。
**中级调度**:按照某种策略决定将哪个**挂起状态的进程**重新调入内存。
| 特点 | 说明 ||------|------|| **目的** | 提高内存利用率和系统吞吐量 || **操作** | 将挂起进程调入/调出内存 || **频率** | 比高级调度频繁 |2.3 低级调度(进程调度)
低级调度:按照某种策略从就绪队列中选取一个进程,将处理机分配给它。
| 特点 | 说明 |
|---|---|
| 频率 | 最基本的一种调度,频率最高 |
| 操作 | 从就绪队列选择进程,分配CPU |
| 必要性 | 一般OS中必须配置 |
---
<a id="对比"></a>## 三、三层调度的对比
| 对比项 | 高级调度 | 中级调度 | 低级调度 ||--------|----------|----------|----------|| **别名** | 作业调度 | 内存调度 | 进程调度 || **调度对象** | 作业 | 挂起进程 | 就绪进程 || **位置** | 外存→内存 | 外存↔内存 | 就绪队列→CPU || **频率** | 最低 | 中等 | **最高** || **影响** | 控制并发度 | 内存利用率 | CPU利用率 || **是否存在** | 批处理系统 | 虚拟内存系统 | 所有OS |
---
<a id="七状态"></a>## 四、七状态模型
在五状态模型的基础上,增加了**挂起就绪**和**挂起阻塞**两个状态。

### 4.1 七种状态
| 状态 | 英文 | 含义 ||------|------|------|| **创建态** | New | 进程正在创建 || **就绪态** | Ready | 在内存中等待CPU || **运行态** | Running | 正在CPU上执行 || **阻塞态** | Blocked | 在内存中等待事件 || **终止态** | Terminated | 进程结束 || **挂起就绪态** | Ready Suspend | 在外存中,但已具备运行条件 || **挂起阻塞态** | Blocked Suspend | 在外存中,等待某事件 |
### 4.2 状态转换4.3 挂起的作用
| 作用 | 说明 |
|---|---|
| 提高内存利用率 | 将不活跃进程调出内存 |
| 容纳更多进程 | 外存可以存放更多进程 |
| 系统负载调节 | 负载高时挂起低优先级进程 |
五、Linux实战:调度管理
5.1 Linux调度器
Linux使用CFS(Completely Fair Scheduler,完全公平调度器):
| 特性 | 说明 |
|---|---|
| 基于虚拟运行时间 | 运行时间少的进程优先 |
| 红黑树组织 | 按虚拟运行时间排序 |
| 时间片动态分配 | 根据进程数量和优先级 |
5.2 查看调度信息
# 查看进程调度策略chrt -p <PID>
# 查看进程优先级ps -eo pid,ni,comm | head
# 查看调度类cat /proc/<PID>/sched5.3 调整进程优先级
# nice值范围:-20(最高)到 19(最低)nice -n 10 ./my_program # 以较低优先级启动renice -5 -p <PID> # 修改运行中进程的优先级
# 实时调度策略chrt -f 50 ./my_program # FIFO实时调度,优先级50chrt -r 50 ./my_program # Round-Robin实时调度5.4 CPU亲和性
# 查看进程在哪个CPU上运行taskset -p <PID>
# 绑定进程到特定CPUtaskset -c 0,1 <PID> # 绑定到CPU 0和1taskset -c 2 ./my_program # 启动时绑定到CPU 25.5 查看系统调度统计
# 查看CPU调度统计cat /proc/schedstat
# 使用mpstat查看CPU使用mpstat -P ALL 1
# 使用pidstat查看进程调度pidstat -p <PID> 15.6 查看进程状态
# 查看进程状态(R/S/D/Z/T)ps aux | awk '{print $8}' | sort | uniq -c
# 统计各状态进程数echo "运行中: $(ps aux | grep ' R ' | wc -l)"echo "睡眠中: $(ps aux | grep ' S ' | wc -l)"echo "僵尸态: $(ps aux | grep ' Z ' | wc -l)"5.7 cgroup限制CPU
# 查看cgroupls /sys/fs/cgroup/cpu/
# 限制进程CPU使用(50%单核)mkdir /sys/fs/cgroup/cpu/limitedecho 50000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_quota_usecho 100000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_period_usecho <PID> > /sys/fs/cgroup/cpu/limited/tasks六、本章小结
核心概念
| 概念 | 要点 |
|---|---|
| 高级调度 | 外存→内存,作业级别,频率最低 |
| 中级调度 | 内存↔外存,挂起进程,提高内存利用率 |
| 低级调度 | 就绪队列→CPU,频率最高,最基本 |
| 七状态模型 | 五状态 + 挂起就绪 + 挂起阻塞 |
三层调度对比
| 对比项 | 高级调度 | 中级调度 | 低级调度 |
|---|---|---|---|
| 频率 | 低 | 中 | 高 |
| 位置 | 外存→内存 | 内存↔外存 | 就绪→CPU |
| 目的 | 控制并发度 | 内存利用率 | CPU利用率 |
考研/期末常见考点
- 三个层次调度的区别和联系
- 高级调度和低级调度的频率对比
- 七状态模型中挂起状态的作用
- 挂起就绪和挂起阻塞的区别
- 为什么低级调度是最基本的调度
思考题
- 高级调度和低级调度分别在什么时候发生?
- 七状态模型相比五状态模型多了什么?
- 挂起状态有什么作用?什么时候会触发挂起?
上一篇:OS笔记(五):线程
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
OS笔记(六):调度的概念、层次
https://emilia520.icu/posts/os-221调度的概念层次/ 部分信息可能已经过时
相关文章 智能推荐
1
OS笔记(二):进程的状态与转换
操作系统 深入理解操作系统中进程的五种状态、状态转换条件,以及在Linux中如何观察进程状态
2
OS笔记(三):进程控制
操作系统 深入理解操作系统中原语的概念、进程的创建/终止/阻塞/唤醒/切换机制,以及Linux中的进程管理实践
3
OS笔记(一):进程与线程简介
操作系统 深入理解操作系统中进程与线程的概念、组成、特征,以及它们在Linux系统中的实际表现
4
OS笔记(四):进程通信
操作系统 深入理解操作系统中进程间通信的三种方式:共享存储、消息传递、管道通信,以及Linux IPC实战
5
OS笔记(五):线程
操作系统 深入理解操作系统中线程的概念、实现方式、多线程模型,以及Linux线程管理实践








