cpu上下文切换
定义
三种上下文切换存在的场景:
线程上下文切换 (同一进程下的线程共享虚拟内存环境变量等,上下文切换不会涉及,消耗较小;多线程代替多进程优势)
进程上下文切换 (不同进程资源不共享,cpu对以下3种上下文均要进行保存和恢复)。
一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。
用户级上下文: 正文、数据、用户堆栈以及共享存储区;
寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。
何时触发进程调度?
一,为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切
换到其它正在等待 CPU 的进程运行。
二,进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。(高io)
三,当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度。
四,当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行。
五,发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序。
中断上下文切换
中断发生以后,CPU跳到内核设置好的中断处理代码中去,由这部分内核代码来处理中断。这个处理过程中的上下文就是中断上下文。
对同一个CPU来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文切换同时发生。由于中断程序会打断正常进程的调度和运行,大部分中断处理程序都短小精悍,以便尽可能快的执行结束。
中断的发生会导致频繁的上下文切换,对性能影响严重。可能表现为sys cpu使用升高。
cpu上下文切换:保存上下文、恢复上下文。如:系统调用(模式切换,比进程上下文切换更简单),发生两次cpu上下文切换(第一次:通过系统调用--》用户态陷入内核。第二次:内核态执行完毕--〉恢复到用户态运行。)
由用户态--〉内核态,需要1、cpu寄存器保存当点用户态指令位置。2、cpu寄存器将位置信息更新为内核态地址)。
定位
查看系统的上下文切换情况
vmstat
r 列:正在执行和等待CPU执行的任务个数,当这个数超过CPU逻辑核数,说明CPU负载比较大(不包括开启超线程)
cs:每秒上下文切换
in:上下文中断次数
us:CUP用户进程使用时间,以百分比显示
sy:CUP系统进程使用时间。以百分比显示
id:CUP的空闲时间,以百分比显示
cs,in:这个值越大,sy(内核CPU)消耗的时间就越长
注意:
CPU上下文切换,又分自愿和非自愿
pidstat
pidstat -wt
cswch/s(自愿):值进程无法获取所需资源导致的上下文切换,比如:I/O,内存等系统资源不足时,就会发生自愿上下文切换
nvcswch/s(非自愿):值进程由于时间已到等原因,被系统强制调度而发生的上下文切换,比如,大量进程都在争夺CPU而发生非自愿上下文切换
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题; 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈; 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

浙公网安备 33010602011771号