我知道物理Win32线程上下文切换的成本估计在2-8k周期之间。是否有关于流程转换成本的估算?
答案 0 :(得分:0)
我没有要求估算,而是测试它。从以下程序开始:
#include <windows.h>
int main() {
for (int i=0; i<1000000; i++)
Sleep(0);
return 0;
}
然后创建一个父程序,产生(比方说)32个副本,然后使用WaitForMultipleObjects
等待它们全部完成。测量从开始到结束的(墙)时间,并除以过程开关的总数。当然,您希望在相对静止的系统上运行以获得有意义的结果。
答案 1 :(得分:0)
Windows必须确定哪个线程 应该下一步。当Windows选择时 要运行的新线程,它执行一个 上下文切换到它。上下文切换 是保存的过程 与之相关的易变机器状态 正在运行的线程,加载另一个 线程的易失性状态,并开始 新线程的执行。
Windows在线程上安排 粒度。这种方法很有意义 当你考虑过程没有 运行,但只提供资源和 他们的线程运行的上下文。 因为做出了调度决策 严格按线程,没有 考虑什么过程 线程属于。例如,如果 进程A有10个可运行的线程, 进程B有2个可运行的线程,和 所有12个线程都是相同的 优先级,每个线程都会 理论上接受十二分之一 CPU时间 - Windows不会给50 处理A和50的CPU百分比 处理B的百分比。
...
线程的上下文和过程 用于上下文切换取决于 在处理器的架构上。一个 典型的上下文切换需要保存 并重新加载以下数据:A。 指令指针B.内核堆栈 指针C.指向地址的指针 线程运行的空间( 进程的页表目录)。该 内核保存此信息 将它推到的旧线程 当前(旧线程)内核模式 堆栈,更新堆栈指针,和 将堆栈指针保存在旧的中 线程的KTHREAD块。内核 然后将堆栈指针设置为新的 线程的内核堆栈和新的 线程的上下文被加载。 如果是新的 它处于不同的进程中 加载其页表的地址 目录成一个特殊的处理器 注册,以便其地址空间 可用。强> 控制传递给新线程 恢复指令指针和 新线程恢复执行。
因此,线程上下文切换到另一个进程的唯一开销与设置一个处理器寄存器的值一样小 - 完全可以忽略不计。