在 Linux 上,上下文切换可能是因为应用程序进行了系统调用,或者因为调度程序将 CPU 中的进程换成了另一个进程。
在 Windows 上,上下文切换的可能原因是什么?具体来说,从我读过的文献来看,高线程数是我迄今为止遇到的高上下文切换的唯一原因。还有其他人吗?
最后,换出同一进程的两个线程的成本与换出两个不同进程的成本是否不同?
在 Linux 上,上下文切换可能是因为应用程序进行了系统调用,或者因为调度程序将 CPU 中的进程换成了另一个进程。
在 Windows 上,上下文切换的可能原因是什么?具体来说,从我读过的文献来看,高线程数是我迄今为止遇到的高上下文切换的唯一原因。还有其他人吗?
最后,换出同一进程的两个线程的成本与换出两个不同进程的成本是否不同?
进行上下文切换的能力是任何多任务操作系统的重要组成部分。在 Linux 中引起上下文切换的相同类型的事物也会在 Windows 中引起上下文切换。
高线程数意味着 CPU 将被迫更频繁地切换上下文以满足调度程序的处理要求。
是的,它是不同的。进程内的两个线程共享相同的虚拟地址空间,因此同一进程内的 htread 之间的上下文切换不必使虚拟到物理的转换无效。不同进程的线程之间的上下文切换必须使当前的 VA-to-PA 转换映射无效。这种转换发生在处理器TLB寄存器中,并且传统上上下文切换会导致 TLB 刷新,这是昂贵的,因为新进程将通过生成软页面错误开始缓慢地构建 TLB 条目。尽管现代 CPU 有更聪明的策略来处理这个问题,但请参阅上面 Wikipedia 链接上的上下文切换段落。
上下文切换是保存当前线程运行状态的行为,以便它可以恢复不同线程的状态,以便它可以在进程上运行。它由内核调度程序自行决定。
内核调度程序执行线程调度和上下文切换。调度程序可以出于各种原因调用线程切换:
来自Windows Internals Book,第 5 版:
如果您想进一步深入了解这一点,可以下载一章 PDF第 5 章:进程、线程和作业。