在 Linux 上,上下文切换可能发生,因为应用程序进行了系统调用,或者调度程序将进程从 CPU 交换为另一个进程。
在 Windows 上,上下文切换的可能原因有哪些?具体来说,从我读过的文献来看,线程数高是目前为止我遇到的唯一导致上下文切换高的原因。还有其他原因吗?
最后,交换同一进程的两个线程的成本与交换两个不同进程的成本是否不同?
答案1
上下文切换能力是任何多任务操作系统必不可少的组成部分。在 Linux 中引起上下文切换的因素同样也会在 Windows 中引起上下文切换。
高线程数意味着 CPU 将被迫更频繁地切换上下文以满足调度程序的处理要求。
答案2
最后,交换同一进程的两个线程的成本与交换两个不同进程的成本是否不同?
是的,它们是不同的。进程内的两个线程共享相同的虚拟地址空间,因此同一进程内 htread 之间的上下文切换不必使虚拟到物理的转换无效。不同进程的线程之间的上下文切换必须使当前的 VA 到 PA 转换映射无效。此转换发生在处理器中传输层协议寄存器,传统上上下文切换会导致 TLB 刷新,这是代价高昂的,因为新进程将通过生成软页面错误来慢慢重建 TLB 条目。不过,现代 CPU 有更聪明的策略来处理这个问题,请参阅上面 Wikipedia 链接中的上下文切换段落。
答案3
上下文切换是保存当前线程的运行状态以便恢复其他线程的状态,从而让其能够在进程上运行的行为。它由内核调度程序自行决定是否发生。
内核调度程序执行线程调度和上下文切换。调度程序可以因各种原因调用线程切换:
- 线程的时间片已用完。时间片是指在被替换为具有相同优先级的线程之前允许线程运行的特定时间量。
- 另一个优先级更高的进程可能需要访问处理器并抢占当前进程
- 当前线程的优先级由于程序或操作系统的操作而下降
- 线程的处理器亲和性发生变化
答案4
上下文切换保存与正在运行的线程相关的易失性机器状态、加载另一个线程的易失性状态以及启动新线程的执行的过程。
过程一组线程对象执行所必需的虚拟地址空间和控制信息。
线Windows 安排执行的进程内的实体。线程包括一组表示处理器状态的易失性寄存器的内容;两个堆栈,一个供线程在内核模式下执行时使用,另一个供线程在用户模式下执行时使用;一个供子系统、运行时库和 DLL 使用的私有存储区域;以及一个称为线程 ID(内部也称为客户端 iD)的唯一标识符。
如果你想进一步深入了解这一点,可以下载一章 PDF 版本第 5 章:进程、线程和作业。