平均负载
平均负载 : 可运行状态 和 不可中断状态 的平均进程数。也表示平均活跃进程数
1 | [root@imwl-175 ~]# uptime |
过去 1 分钟 平均负载 0.05
过去 5 分钟 平均负载 0.14
过去 15 分钟 平均负载 0.37
表明 最近负载 在减少
因为 我这是 2 核 CPU,满 CPU 运行的平均负载 为 2
平均负载 可能是 cpu 密集程序,也可能是 I/O 密集程序导致,一般需要使用 pidstat, mpstat 等工具进一步分析
yum install -y systat
CPU 上下文切换
Linux 是一个多任务操作系统,支持远大于 CPU 数量的任务同时进行(并发 或者 并行)
系统需事先帮 CPU 设置好 寄存器 和程序计数器,从而使 CPU 知道 任务从哪儿加载,从哪儿开始运行
CPU 寄存器 : CPU 内置的容量小,速度极快的内存
程序寄存器 : 用来存储 CPU 正在执行的指令位置,或者即将执行的下一条指令位置
CPU 上下文: CPU 寄存器 + 程序寄存器
CPU 上下文切换: 把前一个任务的 CPU 上下文 保存起来,然后加载 新任务的 上下文到 CPU 寄存器 和 程序寄存器,运行新任务
保存的上下文,会存储到 系统内核中, 等到再次调度时再加载进来
CPU 上下文切换 分为:进程上下文切换, 线程上下文切换, 中断上下文切换。
进程上下文切换
进程的运行空间,按 特权等级 分为: 内核空间 和 用户空间
内核空间 ( Ring 0): 可以访问所有资源
用户空间 ( Ring 3): 只能访问受限资源, 不能直接访问内存等硬件设备,需要通过系统调用陷入到内核中,才能访问这些特权资源
进程 在两个空间运行时: 进程的 用户态,内核态
进程上下文切换, 是指从一个进程切换到另一个进程
系统调用一直在同一个进程内运行。发生两次 CPU 上下文切换, 用户态 → 内核态 → 用户态。 通常称为 特权模式切换
进程上下文切换 :进程 1 → 进程1上下文保存 → 加载进程2上下文 → 进程2
线程上下文切换
线程是调度的基本单位,而进程是资源拥有的基本单位。进程只是给 线程提供 虚拟内存,全局变量等资源。
- 进程只有一个线程,则可以认为 进程等于线程
- 进程有多个线程,这些线程 共享相同的 虚拟内存,全局变量等资源
- 线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的
线程上下文切换:
- 线程属于不同进程,切换就类似于 进程上下文切换
- 同一进程,上下文切换只需要切换 线程的私有数据,寄存器等不共享的数据
所以 线程之间切换 消耗的 资源比 进程之间切换 的资源要少
中断上下文切换
中断处理 会打断进程的正常调度和执行。对于同一个 CPU 来说,中断处理比进程拥有更高的优先级
自愿上下文切换
自愿上下文切换 : 是指进程无法获取所需资源,导致的上下文切换
非自愿上下文切换 : 进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换
DMA
Direct Memory Access(DMA)的模块,这个模块允许硬件设备直接通过 DMA 写内存,而不需要通过 CPU(占用 CPU 资源)。