探讨 Linux CPU 的上下文切换

💡 原文中文,约3300字,阅读约需8分钟。
📝

内容提要

Linux是一个强大的多任务操作系统,支持同时运行的任务数量远远大于CPU的数量。上下文切换有三种类型:进程、线程和中断。过多的上下文切换会降低系统性能。

🔎

延伸解读

上下文切换为何消耗CPU时间

文章指出,每次上下文切换需要几十纳秒至微秒的CPU时间,用于保存和恢复寄存器、内核栈、虚拟内存等资源。在大量切换的场景下,CPU会花费可观的时间在这些保存与恢复操作上,从而缩短进程实际运行时间,导致系统整体性能下降。

系统调用与进程切换的关键区别

系统调用过程中会发生两次CPU上下文切换,但始终运行同一个进程,不涉及进程切换和虚拟内存等资源切换。而进程上下文切换是从一个进程切换到另一个进程,需要额外保存和加载虚拟内存、栈等用户空间资源以及内核状态,因此开销更大。

线程切换开销更小的原因

线程是任务调度的基本单位,进程是资源获取的基本单位。同一进程内的线程共享虚拟内存和全局变量,切换时只需切换线程的私有数据(如栈和寄存器),不涉及虚拟内存资源切换,因此比跨进程切换消耗的资源更少。这也是多线程替代多进程的优势之一。

中断上下文切换的特点

中断上下文切换是为了快速响应硬件事件,不涉及进程的用户态,因此不需要保存和恢复虚拟内存、全局变量等用户态资源。但中断切换同样会消耗CPU,过多的中断切换会严重降低系统整体性能,需要留意排查。

❓

Q&A

Linux中的上下文切换是什么?

上下文切换是保存上一个任务的CPU上下文并加载新任务的上下文的过程。

Linux支持多少个任务同时运行?

Linux支持同时运行的任务数量远大于CPU的数量。

进程上下文切换和线程上下文切换有什么区别?

进程上下文切换涉及内核空间和用户空间的切换,而线程上下文切换则在同一进程内共享虚拟内存,消耗资源更少。

什么情况下会发生进程上下文切换?

当进程的CPU时间片用完、系统资源不足、进程主动挂起或高优先级进程需要运行时,会发生进程上下文切换。

中断上下文切换的特点是什么?

中断上下文切换用于快速响应事件,不涉及进程的用户态资源,主要保存进程的当前状态以便恢复。

过多的上下文切换会有什么影响?

过多的上下文切换会消耗CPU时间,导致系统性能下降。

🏷️

标签

➡️

继续阅读