稍微详细描述一下,上下文切换可以认为是内核(操作系统的核心)在 cpu 上对于进程(包括线程)进行以下的活动:(1)挂起一个进程,将这个进程在 cpu 中的状态(上下文)存储于内存中的某处,(2)在内存中检索下一个进程的上下文并将其在 cpu 的寄存器中恢复,(3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。
上下文切换与模式切换
这两种模式(用户态和内核态)在类 unix 系统中共存意味着当系统调用发生时 cpu 切换到内核态是必要的。这应该叫做模式切换而不是上下文切换,因为没有改变当前的进程。
上下文切换在多任务操作系统中是一个必须的特性。多任务操作系统是指多个进程运行在一个 cpu 中互不打扰,看起来像同时运行一样。这个并行的错觉是由于上下文在高速的切换(每秒几十上百次)。当某一进程自愿放弃它的 cpu 时间或者系统分配的时间片用完时,就会发生上下文切换。
上下文切换有时也因硬件中断而触发。硬件中断是指硬件设备(如键盘、鼠标、调试解调器、系统时钟)给内核发送的一个信号,该信号表示一个事件(如按键、鼠标移动、从网络连接接收到数据)发生了。
英特尔的 80386 和更高级的 cpu 都支持硬件上下文切换。然而,大多数现代的操作系统通过软件实现上下文切换,而非使用硬件上下文切换,这样能够运行在任何 cpu 上。同时,使用软件上下文切换可以尝试获得更好的性能。软件的上下文切换最先在 linux 2.4 中实现。
软件上下文切换号称的一个主要优点是,硬件的机制保存了几乎所有 cpu 的状态,软件能够有选择性的保存需要被保存的部分并重新加载。然而这个行为对于提升上下文切换的性能到底有多重要,还有一点疑问。其拥护者还宣称,软件上下文切换有提高切换代码的可能性,它有助于提高正在加载的数据的有效性,从而进一步提高性能。
上下文切换的消耗
上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 cpu 时间,事实上,可能是操作系统中时间消耗最大的操作。
linux相比与其他操作系统(包括其他类 unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。