在Linux上,可能会发生上下文切换,因为应用程序进行系统调用,或者由于调度程序将进程从CPU切换到另一个进程。
在Windows上,上下文切换的可能原因是什么? 具体来说,从我读过的文献来看,高线程数是我迄今为止遇到的高级上下文切换的唯一原因。 有其他人吗?
最后,交换两个不同进程的代价是否是交换同一进程的两个线程的代价?
执行上下文切换的能力是任何多任务操作系统的重要组成部分。 在Linux中导致上下文切换的相同types也会导致在Windows中进行上下文切换。
所有高线程数意味着CPU将被迫更频繁地切换上下文以满足调度器的处理要求。
最后,交换两个不同进程的代价是否是交换同一进程的两个线程的代价?
是的,这是不同的。 进程内部的两个线程共享相同的虚拟地址空间,因此同一进程内的htread之间的上下文切换不必使虚拟到物理转换无效。 不同进程的线程之间的上下文切换必须使当前的VA到PA转换映射无效。 这种转换发生在处理器TLB寄存器中,并且传统上是一种上下文切换引起TLB刷新,这是昂贵的,因为新进程将通过产生软页面错误而开始缓慢地构buildTLB条目。 现代的CPU虽然有更聪明的策略来处理这个问题,请参阅上面维基百科链接的上下文切换段落。
上下文切换是保存当前线程运行状态的行为,以便它可以恢复不同线程的状态,以便它可以在进程上运行。 它由内核调度程序自行决定。
内核调度程序执行线程调度和上下文切换。 调度员可以由于各种原因调用线程切换:
从Windows内部书,第5版 :
上下文切换保存与正在运行的线程关联的易失性机器状态,加载另一线程的易失性状态以及启动新线程的执行的过程。
进程执行一组线程对象所需的虚拟地址空间和控制信息。
线程 Windows中计划执行的进程中的实体。 线程包括一组表示处理器状态的易失性寄存器的内容; 两个堆栈,一个用于在内核模式下执行时使用的线程,另一个用于在用户模式下执行的线程; 专用存储区,供子系统,运行时库和DLL使用; 和一个称为线程ID(也称为客户端iD)的唯一标识符。
如果你想进一步深入下去,有一章可以下载为PDF 第五章:进程,线程和作业 。