问题
内核对进程调度时发生了什么?
进程调度的本质
任务 / 进程 切换
- 即:上下文切换,内核对处理器上的执行的进程进行切换
- "上下文" 指:寄存器的值
- "上下文切换" 指:
- 将寄存器的值保存在内存中 (进程被剥夺处理器,停止执行)
- 将另一组寄存器的值从内存中加载到寄存器 (调度下一个进程执行)
进程调度的本质
当时间片耗完,不管进程正在执行什么代码,都一定会发生上下文切换!
上下文切换必然导致进程状态的转换
上下文切换由中断触发 (时钟中断,IO中断,等)
详解 Linux 进程状态 (ps au)
细说空闲状态
处理器上电后,开始一直不停的向下执行指令
当系统中没有进程时,会执行一个 "不执行任何操作的" 的空闲进程
空闲进程的职责:执行特殊指令使处理器进入休眠状态 (低功耗状态)
空闲状态是一种暂态,但凡出现就绪进程,空闲状态立即结束
Linux 性能工具简介
ps -- 查看进程运行时数据 (ps au)
top -- Linux 整体性能监测工具 (类似任务管理器)
sar -- Linux 活动情况报告 (系统性能分析工具)
Linux 系统平均负载
即:Linux 系统负载平均值 (Linux System Load Averages)
该值表示的是一段时间内任务对系统资源需求的平均值 (1、5 和 15 分钟)
- 如果平均值接近 0,意味着系统处于空闲状态
- 如果平均值大于 1,意味着系统繁忙,任务需要等待,无法及时执行
- 如果 1min 平均值高于 5min 或 15min 平均值,则负载正在增加
- 如果 1min 平均值低于 5min 或 15min 平均值,则负载正在减少
详解 sar -q
runq-sz:执行队列的长度
plist-sz:运行中的任务 (进程 & 线程) 总数
ldavg-1:最近 1min 系统平均负载
ldavg-5:最近 5min 系统平均负载
ldavg-15:最近 15min 系统平均负载
系统调度观察实验
通过 Linux 性能工具观察进程调度
- 单处理器运行过程
- 多处理器运行过程
系统调度核心性能指标
吞吐量:单位时间内的工作总量 (越大越好)
- 处理器资源消耗越多 (空闲状态占比越低),吞吐量越大
- 对于进程调度而言,吞吐量指单位时间处理的进程数量
延迟:从开始处理任务到结束处理任务所耗费的时间 (越短越好)
- 对于进程而言,延迟即生命期,指进程从运行到结束所经历的时间
- 注意:运行 和 结束 不同,运行时间可能很长,但执行时间可能很短
吞吐量计算一
吞吐量计算二
吞吐量计算三
假设:每个进程固定执行 60ms
则:进程运行结束时
结论:
处理器的能力由硬件设计决定,吞吐量决定一个上限
当吞吐量未达上限,进程的延迟取决于进程自身
当吞吐量达到上限,随着进程数量增加,总延迟增加,但平均延迟不变
思考
多核吞吐量计算
现实中的系统
理想状态:进程正在执行,并且没有就绪状态的进程
空闲状态:处理器占用率低,吞吐量低
繁忙状态:
多个进程同时运行,但存在多个就绪状态的进程
此时,吞吐量很高(可能达到峰值),但总延迟会变长