首先,操作系统会在内核模式下引入传出线程(如果它还不存在的话) ,因为线程切换只能在运行在内核模式下的线程之间执行。然后调用调度程序来决定将执行切换到哪个线程。在做出决定之后,内核将位于 CPU (CPU 寄存器)中的部分线程上下文保存到内存中的专用位置(通常位于外出线程的内核堆栈的顶部)。然后内核执行从输出线程的内核堆栈到输入线程的内核堆栈的切换。然后,内核将以前存储的从内存传入线程的上下文加载到 CPU 寄存器中。最后将控制返回到用户模式,但是处于新线程的用户模式。
在操作系统确定传入线程在 另一个进程中运行的情况下,内核执行一个额外的步骤: 设置新的活动虚拟地址空间。
这两种情况下的主要成本都与缓存污染有关。在大多数情况下,传出线程使用的工作集将与传入线程使用的工作集大不相同。因此,传入的线程将在大量缓存丢失的情况下开始其生命周期,从而刷新缓存中的旧数据和无用数据,并从内存中加载新数据。对于 TLB (位于 CPU 上的翻译查看旁边的缓冲区)也是如此。在虚拟地址空间重置(线程运行在不同的进程中)的情况下,代价更大,因为虚拟地址空间的重置导致整个 TLB、 甚至的刷新,如果新线程实际上只需要加载很少的新条目。因此,新线程将开始它的时间量,许多 TLB 缺失和频繁的页面遍历。线程切换的直接成本也不可忽视(从约250到约1500-2000个周期) ,并取决于 CPU 的复杂性,线程的状态和它们实际使用的寄存器集。