为什么上下文切换很慢?

时间:2013-01-18 00:32:58

标签: asynchronous parallel-processing

我想知道为什么与同一线程上的异步操作相比,上下文切换速度很慢。

为什么最好运行N个线程(N等于核心数),每个线程以异步方式处理M个客户端,而不是运行M个线程?我已经说过原因是上下文切换开销,但我找不到上下文切换有多慢。

1 个答案:

答案 0 :(得分:1)

只是为了澄清我会假设当你说“而不是运行M个线程”时你的意思是N * M个线程(如果你运行M个线程,每个线程都需要处理N个客户端以匹配相同的总数客户,这将是一个类似的案例)。

因此,在N个核心中运行的N个线程,每个处理M个客户端,以及在相同数量的核心中运行的N * M个线程之间的区别是,在第一种情况下,您不必创建新线程,正如你所说,你不会有上下文切换。这是一个优点,因为创建OS线程所需的工作量很大;它需要创建一个不同的进程空间,一个新的堆栈等。此外,如果你有更多的线程,OS调度程序将停止并激活正在运行的进程,这也是非常耗时的。每次调度程序更改分配给核心的进程时,它可能还需要缓存此进程的上下文,添加大量缓存未命中,从而增加时间。

另一方面,如果您有一个固定数量的线程,等于核心数(有时甚至建议N-1),您可以管理用户级调度程序中的“任务”或客户端,这可能会导致在一些程序的计算中,但避免了很多操作系统进程和内存管理,使整体执行速度更快。一些当前的并行API,如.Net任务并行库(TPL),OpenMP,英特尔的线程构建模块或Cilk,体现了这种称为动态多线程的并行模型。