探讨 Linux CPU 的上下文切换
内容提要
Linux是一个强大的多任务操作系统,支持同时运行的任务数量远远大于CPU的数量。上下文切换有三种类型:进程、线程和中断。过多的上下文切换会降低系统性能。
延伸解读
上下文切换为何消耗CPU时间
文章指出,每次上下文切换需要几十纳秒至微秒的CPU时间,用于保存和恢复寄存器、内核栈、虚拟内存等资源。在大量切换的场景下,CPU会花费可观的时间在这些保存与恢复操作上,从而缩短进程实际运行时间,导致系统整体性能下降。
系统调用与进程切换的关键区别
系统调用过程中会发生两次CPU上下文切换,但始终运行同一个进程,不涉及进程切换和虚拟内存等资源切换。而进程上下文切换是从一个进程切换到另一个进程,需要额外保存和加载虚拟内存、栈等用户空间资源以及内核状态,因此开销更大。
线程切换开销更小的原因
线程是任务调度的基本单位,进程是资源获取的基本单位。同一进程内的线程共享虚拟内存和全局变量,切换时只需切换线程的私有数据(如栈和寄存器),不涉及虚拟内存资源切换,因此比跨进程切换消耗的资源更少。这也是多线程替代多进程的优势之一。
中断上下文切换的特点
中断上下文切换是为了快速响应硬件事件,不涉及进程的用户态,因此不需要保存和恢复虚拟内存、全局变量等用户态资源。但中断切换同样会消耗CPU,过多的中断切换会严重降低系统整体性能,需要留意排查。
Q&A
Linux中的上下文切换是什么?
上下文切换是保存上一个任务的CPU上下文并加载新任务的上下文的过程。
Linux支持多少个任务同时运行?
Linux支持同时运行的任务数量远大于CPU的数量。
进程上下文切换和线程上下文切换有什么区别?
进程上下文切换涉及内核空间和用户空间的切换,而线程上下文切换则在同一进程内共享虚拟内存,消耗资源更少。
什么情况下会发生进程上下文切换?
当进程的CPU时间片用完、系统资源不足、进程主动挂起或高优先级进程需要运行时,会发生进程上下文切换。
中断上下文切换的特点是什么?
中断上下文切换用于快速响应事件,不涉及进程的用户态资源,主要保存进程的当前状态以便恢复。
过多的上下文切换会有什么影响?
过多的上下文切换会消耗CPU时间,导致系统性能下降。