千家信息网

CPU上下文切换是什么意思

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"CPU上下文切换是什么意思",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"CPU上下文切换是什么意思"吧!CPU 上下文 可以理解成 CP
千家信息网最后更新 2026年11月03日CPU上下文切换是什么意思

本篇内容主要讲解"CPU上下文切换是什么意思",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"CPU上下文切换是什么意思"吧!

CPU 上下文 可以理解成 CPU寄存器状态以及程序计数器PC , 这些都是记录CPU当前任务的状态。CPU 上下文切换 会把当前的cpu的上下文保存下来,然后加载新任务的对应上下文,而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。

任务一般包括:

1.进程

2.线程

3.中断上下文

CPU 上下文的切换会因特权模式切换、进程上下文切换、线程上下文切换以及中断上下文切换 产生。

特权模式切换

Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。内核空间(Ring 0)具有最高权限,可以直接访问所有资源;用户空间(Ring 3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。

进程可以在用户空间运行,也可以在内核空间运行。 当调用open()、read()、write()、close()系统函数,CPU会保存原来用户态的指令位置,然后更新CPU寄存器内核态指令的新位置。最后执行内核态函数。当系统调用结束后,CPU恢复原来的用户态,切换回用户空间继续执行进程。

可以看到 用户态->内核态, 内核态->用户态 这两个过程总共是产生了两次CPU上下文切换。不过,需要注意的是,系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源

进程上下文切换

进程上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态,与系统调用相比进程间的切换还需要把内容保存下来。

进程上下文切换数量多,容易导致CPU花费更多的时间在寄存器、虚拟内存、内核栈等资源的保存和恢复上,减少了进程运行时间,致使平均负载升高。Linux 通过 TLB(Translation Lookaside Buffer)来管理虚拟内存到物理内存的映射关系。当虚拟内存更新后,TLB 也需要刷新,内存的访问也会随之变慢。特别是在多处理器系统上,缓存是被多个处理器共享的,刷新缓存不仅会影响当前处理器的进程,还会影响共享缓存的其他处理器的进程。

进程上下文切换发生在进程调度的过程。

主要在以下场景触发:

CPU时间是被划分成各个时间片,当前进程的时间片被耗尽之后会被系统挂起,切换到其他正在等待CPU的进程来运行。
进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。

当进程通过睡眠函数 sleep 或者 sched_yield 这样的方法将自己主动挂起时,自然也会重新调度。

当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行。

发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序。

线程上下文切换

线程与进程最大的区别在于,线程是调度的基本单位,而进程则是资源拥有的基本单位。linux内核中的任务调度,实际上的调度对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源。进程中只有一个线程,进程等于线程。因为同一进程下线程是共享虚拟内存,相关间的切换只需保存其私有数据、寄存器等,因此进程内的线程切换比进程间的切换消耗更少资源。

中断上下文切换

为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断结束后,进程仍然可以从原来的状态恢复运行。跟进程上下文不同,中断上下文切换并不涉及到进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。中断上下文,其实只包括内核态中断服务程序执行所必需的状态,包括 CPU 寄存器、内核堆栈、硬件中断参数等。对同一个 CPU 来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文切换同时发生。同样道理,由于中断会打断正常进程的调度和执行,所以大部分中断处理程序都短小精悍,以便尽可能快的执行结束。另外,跟进程上下文切换一样,中断上下文切换也需要消耗 CPU,切换次数过多也会耗费大量的 CPU,甚至严重降低系统的整体性能。所以,当你发现中断次数过多时,就需要注意去排查它是否会给你的系统带来严重的性能问题。

CPU上下文切分析

vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。

root@ECSab169d:~# vmstat 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 1  0  90720 3960176   1036 3014980    0    0    35    85    0    1  1  0 98  0  0 0  0  90720 3959928   1036 3015004    0    0     0    24  240  358  0  0 99  0  0 0  1  90720 3959356   1036 3015068    0    0     0    34  260  390  1  0 99  0  0 0  0  90720 3959204   1036 3015088    0    0     0    23  234  340  0  0 99  0  0 0  0  90720 3960708   1036 3015088    0    0     0   609  297  429  0  0 99  0  0 0  0  90720 3960772   1036 3015112    0    0     0   140  295  410  0  0 99  0  0 0  0  90720 3960688   1036 3015164    0    0     0    36  269  406  0  0 99  0  0

r 是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。

b 则是处于不可中断睡眠状态的进程数

swpd 交换分区大小,一般在内存不足的情况会使用swap进行扩展。

free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in 每秒CPU的中断次数,包括时间中断

cs 每秒上下文切换次数

可以看到,这个例子中的上下文切换次数 cs 是 33 次,而系统中断次数 in 则是 25 次,而就绪队列长度 r 和不可中断状态进程数 b 都是 0。

vmstat 只给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,就需要使用我们前面提到过的 pidstat 了。给它加上 -w 选项,你就可以查看每个进程上下文切换的情况了。

root@xxxxx:~# pidstat -w 5Linux 4.15.0-66-generic (xxxxx)     01/25/2021      _x86_64_        (4 CPU)05:30:32 PM   UID       PID   cswch/s nvcswch/s  Command05:30:37 PM     0         8     18.16      0.00  rcu_sched05:30:37 PM     0        11      0.20      0.00  watchdog/005:30:37 PM     0       183      4.59      0.00  kworker/3:1H05:30:37 PM     0       388      2.40      0.00  kworker/0:1H05:30:37 PM     0       546      0.20      0.00  irqbalance05:30:37 PM     0       621      9.98      0.00  qemu-ga05:30:37 PM   109       663      0.40      0.00  uml_switch05:30:37 PM     0      1275      0.40      0.00  master05:30:37 PM   110      1277      0.20      0.00  qmgr05:30:37 PM     0      5896      7.39      0.00  kworker/0:005:30:37 PM     0     13579      8.18      0.00  sshd05:30:37 PM     0     13766      0.20      0.00  vmstat05:30:37 PM     0     26398      5.19      0.00  kworker/u8:105:30:37 PM     0     28341      6.19      0.00  kworker/u8:205:30:37 PM     0     28898      5.99      1.40  bash

这个结果中有两列内容是我们的重点关注对象。一个是 cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数,另一个则是 nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。

谓自愿上下文切换: 是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。

非自愿上下文切换: 则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。

总结

自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;

非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;

中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型

到此,相信大家对"CPU上下文切换是什么意思"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

进程 切换 上下 上下文 内存 系统 内核 资源 用户 运行 线程 调度 次数 空间 状态 处理 程序 任务 时间 寄存器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州为想互联网科技有限公司 互联网科技公司经营范围 北京路客互联网科技有限公司 互联网科技活动banner 今日互联网科技 互联网与科技金融数据 与互联网科技公司 善班互联网科技有限公司 银川新华互联网科技学校地址 互联网科技博主是什么意思 互联网科技项目计划书材料类 受益于互联网科技的高速发展 互联网5g黑科技有哪些 华夏恒生互联网科技013171 长沙茂晟互联网科技有限公司 朱啸虎曾投资哪些互联网科技企业 美国互联网科技实力 高科技互联网套路 科技互联网专业工作会议发言稿 10位科技互联网大佬 互联网科技产业 奇酷互联网科技公司 睿民互联网科技 昭通互联网科技选哪家 晓花互联网科技有限公司网址 天津腾达互联网科技有限公司 燊美集互联网科技有限公司 云南省自由互联网科技有限公司 互联网硬科技公司 好易买互联网科技
0