当前位置: 首页 > 科技观察

啃了24小时,终于明白上下文切换了!

时间:2023-03-13 18:30:41 科技观察

大家好,我是树哥。对于服务器系统来说,上下文切换也是影响系统性能的一个重要因素。深入理解上下文切换的原理,有助于我们做好性能优化。今天就带大家了解一下上下文切换的几种情况以及切换背后的具体信息,然后介绍一些监测上下文切换指标的工具,最后总结一些可能出现上下文切换异常的场景。深入理解系统上下文切换什么是上下文切换?我们知道Linux是一个多任务操作系统,可以支持远大于CPU数量的任务同时运行。但实际上,只有CPU个数的进程在同时运行。CPU时间片到达后,进程调度器会将CPU资源分配给其他进程。在这个过程中,会涉及到进程之间的切换。这时候就需要保存当前进程的上下文信息,然后加载调度进程的上下文信息。这就是上下文切换。这里所说的上下文信息不仅包括虚拟内存、栈、全局变量等用户态资源,还包括内核栈、寄存器等内核态资源。不同类型的上下文切换会涉及到不同类型资源的切换,例如:同一个进程中不同线程的切换只需要切换内核态的资源,不需要切换用户态的资源.上下文切换类型Context也分为三种,分别是:进程上下文切换线程上下文切换中断上下文切换进程上下文切换进程上下文切换是指不同进程之间的切换。一般来说,一个进程被调度的机会有以下几种:当某个进程时间片用完时,它会被系统挂起,切换到其他进程等待CPU。进程需要的系统资源不足,需要等到资源满足再运行。这个时候会被挂起,其他进程会被调度。通过sleep方法主动挂起进程,其他进程有机会被调度。对于优先级高的进程,会挂起当前进程,调度高优先级的进程。当硬件中断时,CPU上的进程会被中断挂起,然后执行内核中的中断服务程序。当出现上述情况时,就会发生进程调度,进而发生进程上下文切换。线程上下文切换我们都知道,进程是资源分配的基本单位,线程是调度的基本单位,进程只是为线程提供虚拟内存等资源。线程上下文切换分为两种情况:进程调度前后的两个线程属于同一个进程。这时,因为资源是共享的,切换时不需要更改虚拟内存等这些资源,只需要切换线程的私有数据、寄存器等不共享的数据即可。进程调度前后的两个线程不属于同一个进程。这时因为资源是共享的,所以切换过程和进程上下文切换是一样的。所以你会发现同一个进程内的线程切换比多进程间切换消耗的资源更少。这其实是多线程相对于多进程的一个优势。中断上下文切换中断上下文切换是指响应硬件事件。中断处理会打断进程的正常调度和执行,转而调用中断处理程序来响应设备事件。当中断其他进程时,需要保存当前状态。这样,中断结束后,进程仍然可以从原来的状态恢复运行。中断上下文切换不需要保存和恢复进程的虚拟内存等用户态资源,只需要处理CPU寄存器、内核栈等内核态资源。分析工具检查系统的上下文切换。可以使用三个工具,分别是:vmstat命令、pidstat命令和/proc/interrupts文件。vmstat命令vmstat是一种常用的系统性能分析工具。主要用于分析系统的内存使用情况,也常用于分析CPU上下文切换次数和中断次数。该命令的语法格式为:vmstat