一 cpu上下文
任务要运行,cpu需要知道任务从哪里加载,从哪里开始运行,需要设置好CPU寄存器和程序计数器(PC)。
CPU寄存器,容量小,速度快。程序计数器,存储CPU正在执行的指令位置或即将执行的下一条指令位置。它们是运行任何CPU前,必须依赖的环境。
二 上下文切换
即保存在内核中的上下文的改变,在切换任务时候需要切换上下文,即更换寄存器中的值。
根据任务的不同:
进程上下文切换
线程上下文切换
中断上下文切换
2.1 进程上下文切换
linux按照特权等级,进程空间分为内核态和用户态,CPU特权等级分为ring 0和ring3。
内核空间ring 0: cpu具有最高权限,可以访问任何资源
用户空间ring 3:只能访问受限资源,不能直接访问硬件设备,必须通过系统调用陷入到内核中才能访问特权资源。

进程在即在用户态运行,也可以在内核态运行,进程进行系统调用的时候会进行上下文切换。(因为内核态和用户态的上下文不同)一次系统调用需要发生两次上下文切换,一般来说上下文切换是指不同进程,同一个进程叫特权模式切换。
进程切换只发生在内核态,因为进程是由内核管理和调度的
进程上下文切换和系统调用上下文切换不同,进程上下文包括虚拟内存,栈,全局变量等用户空间资源;还包括内核堆栈,寄存器等内核空间状态。
因此进程上下文比系统调用上下文切换多了了用户空间的进程上下文的切换。
进程的用户空间上下文保存→进程的内核空间上下文保存→下一个进程的内核空间的上下文恢复→下一个进程的用户态上下文保存。
每次进程上下文切换为纳秒和微妙级别。
2.2 进程上下文切换时机
Linux为每个cpu维护了一个就绪队列,按照进程优先级和等待时间排序,选择优先级最高和等待cpu时间最长的的进程来运行。
切换时机:
进程执行完毕
进程时间片耗尽
进程所需资源不足(比如内存,io等)
进程主动休眠,让出cpu
被更高优先级进程打断
被硬件中断打断
2.3 线程上下文切换
内核中任务调度的单位是线程,而进程是资源拥有的基本单位。
当进程只有一个线程时,进程和线程可以看做等同。
多线程情况下,多线程共享相同的全局变量,虚拟内存,这些线程做上下文切换的时候不用更改。
线程也有私有数据,进行上线切换的时候需要保存和恢复。
线程上下文切换,要看是否属于同一个进程,属于一个进程,则只需要保存和恢复线程的私有数据;不同的进程的线程的上下文切换,则同进程上下文切换。
2.4中断上下文切换
中断上下文切换不涉及到进程的用户态的数据保存,因为并不涉及到用户态进程切换,只保存内核态涉及到的CPU寄存器,内核堆栈和硬件参数等。中断会打断正常的进程运行,所以中断处理程序一般设计的短小精悍。
中断上下文切换,也需要消耗cpu,切换次数过多,会消耗大量CPU。
三 查看上下文切换
1.1 系统总体上下文切换查看
[root@localhost tmp]# vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
120 0 4012668 550884 1104 50445088 0 0 135 693 1 1 33 2 65 0 0
115 0 4012668 541140 1104 50454436 0 0 0 650 81600 69446 49 51 0 0 0
107 0 4012668 532568 1104 50462320 0 0 0 220 82290 70686 48 52 0 0 0
119 0 4012668 523700 1104 50471676 0 0 0 6508 82118 70445 49 51 0 0 0说明:
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
1.2 每个进程上下中断查看
[root@localhost tmp]# pidstat -w 5
Linux 4.18.0-305.3.1.el8.x86_64 (localhost.localdomain) 11/20/2021 _x86_64_ (40 CPU)
04:22:27 PM UID PID cswch/s nvcswch/s Command
04:22:32 PM 0 8 2.39 0.00 kworker/u80:0-bnxt_pf_wq
04:22:32 PM 0 12 192.25 0.00 rcu_sched
04:22:32 PM 0 14 0.20 0.00 watchdog/0
04:22:32 PM 0 17 0.20 0.00 watchdog/1
04:22:32 PM 0 24 0.20 0.00 watchdog/2
04:22:32 PM 0 30 0.20 0.00 watchdog/3
cswch,表示每秒自愿上下文切换(voluntary context switches)的次数
nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数
说明:
所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换
四 中断是否异常
一般中断是否异常,根据中断数不好判断,一般来说不超过1万个,超出了需要多关注。
# 每隔1秒输出1组数据(需要 Ctrl+C 才结束)# -w参数表示输出进程切换指标,而-u参数则表示输出CPU使用指标
$pidstat -w -u 1
#输出线程指标数据
$pidstat -wt 1
# -d 参数表示高亮显示变化的区域
# 观察中断类型
$ watch -d cat /proc/interrupts上下文切换类型:
自愿上下文切换多,说明进程在等待资源,有可能发生IO问题。
非自愿上下文切换,说明CPU被强制调度,说明cpu确实是瓶颈。
中断次数太多的话,需要看中断类型进行分析。
本文详细介绍了CPU上下文切换的概念,包括进程、线程及中断上下文切换的过程和时机,并提供了如何查看系统上下文切换的方法。
1122

被折叠的 条评论
为什么被折叠?



