上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。上下文切换过程中的信息被保存在进程控制块(PCB-Process Control Block)中。PCB又被称作切换帧(SwitchFrame)。上下文切换的信息会一直被保存在CPU的内存中,直到被再次使用。 上下文切换定义 CPU 上下文切换 虽然系统的 CPU 个数有限,但能支持同时运行多个任务。当然这种同时只是宏观上的假象,如果从微观角度观察,会发现系统在不停轮流切换任务,使得每个任务都能获得运行的机会。 CPU 寄存器和程序计数器就是 CPU 上下文,因为它们都是 CPU 在运行任何任务前,必须的依赖环境。 CPU 是状态 + 存储的模型,其符合图灵机这种理想设备 内存 PC 指针指向下一条待运行的指令(状态) 计算规则 其他辅助计算的寄存器(状态) 多任务的每个任务都有自己的状态。当任务 1 切出,任务 2 切入时,CPU 的状态也要切换成任务 2 上一次切出时的状态,这样任务 2 才能继续运行。这些状态即是 CPU 上下文,CPU 上下文切换即保存和恢复 PC 和辅助计算的寄存器(也就是 CPU 寄存器和程序计数器)。 CPU 上下文切换的类型 根据任务的不同,可以分为以下三种类型: 进程上下文切换 线程上下文切换 中断上下文切换 进程上下文切换 发生进程上下文切换的场景 为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 的进程运行。 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。 当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度。 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序。 进程/线程的CPU上下文切换成本来源 CPU 中的寄存器似乎一只手就数的过来,切换的成本非常小,为什么会造成系统负载显著升高呢?Linux 操作系统中的任务有进程和线程,切换的主要成本来自于进程/线程的上下文切换。……

阅读全文