一、上下文切换的基本概念
Linux 是一个多任务的操作系统,可以同时并发执行多个任务,任务数超过CPU核心数。同一时刻在执行的任务数,最多也只能是CPU核心数,只不过CPU时间片在多个任务之间来回切换罢了。上下文切换就是为了保存任务切换时刻的基本信息,当CPU重新执行任务的时候可以加载上下文信息,从当时退出的位置、状态重新开始执行任务。这里所说的上下文信息,既包括虚拟内存、栈、全局变量等用户态的资源,也包括内核堆栈、寄存器等内核态的资源。
二、上下文切换的类型
1、 进程上下文切换:指多个进程并发。
2、 线程上下文切换:包含了同一个进程内的和不同进程内的,不同进程内的消耗等同于进程上下文切换。
3、 中断上下文切换:因为外设控制器执行速度通常慢于CPU,比如打印一个数据这个时候需要内核调用显示设备,很慢怎么办呢?这个是时候就会触发中断,让CPU先干别的进程,等打印完成了再回来。
三、Linux下查看上下文切换的命令
1、vmstat 1 查看整个系统的上下文切换情况
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
2、pidstat -w 5 查看具体某个进程的上下文切换情况
cswch 表示每秒自愿上下文切换(voluntary context switches)的次数。
nvcswch 表示每秒非自愿上下文切换(non voluntary context switches)的次数。