平均负载

平均负载

平均负载 : 可运行状态 和 不可中断状态 的平均进程数。也表示平均活跃进程数

1
2
[root@imwl-175 ~]# uptime
06:02:51 up 5 days, 3:07, 3 users, load average: 0.05, 0.14, 0.37

过去 1 分钟 平均负载 0.05

过去 5 分钟 平均负载 0.14

过去 15 分钟 平均负载 0.37

表明 最近负载 在减少

因为 我这是 2CPU,满 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

线程上下文切换

线程是调度的基本单位,而进程是资源拥有的基本单位。进程只是给 线程提供 虚拟内存,全局变量等资源。

  1. 进程只有一个线程,则可以认为 进程等于线程
  2. 进程有多个线程,这些线程 共享相同的 虚拟内存,全局变量等资源
  3. 线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的

线程上下文切换:

  1. 线程属于不同进程,切换就类似于 进程上下文切换
  2. 同一进程,上下文切换只需要切换 线程的私有数据,寄存器等不共享的数据

所以 线程之间切换 消耗的 资源比 进程之间切换 的资源要少

中断上下文切换

中断处理 会打断进程的正常调度和执行。对于同一个 CPU 来说,中断处理比进程拥有更高的优先级

自愿上下文切换

自愿上下文切换 : 是指进程无法获取所需资源,导致的上下文切换
非自愿上下文切换 : 进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换

DMA

Direct Memory Access(DMA)的模块,这个模块允许硬件设备直接通过 DMA 写内存,而不需要通过 CPU(占用 CPU 资源)。