我想知道为什么上下文切换比同一线程上的异步操作慢。
为什么运行N个线程(其中N等于内核的数量),每个线程同步处理M个客户端,而不是运行M个线程?我已经说过原因是上下文切换开销,但我找不到上下文切换有多慢。
发布于 2013-01-19 23:45:24
为了澄清,我假设当你说“而不是运行M个线程”时,你指的是N*M个线程(如果你运行M个线程,每个线程将需要处理N个客户端,以便匹配相同数量的客户端,这将是类似的情况)。
因此,在N个内核中运行N个线程,每个线程处理M个客户端,与在相同数量的内核中运行N*M个线程之间的区别在于,在第一种情况下,您不必创建新的线程,而且,正如您所说的,您不会进行上下文切换。这是一个优势,因为创建OS线程所需的工作很繁重;它需要创建不同的进程空间、新的堆栈等。此外,如果您有更多的线程,OS调度程序将停止并激活正在运行的进程,这也很耗时。每次调度器更改分配给内核的进程时,它可能还需要缓存该进程的上下文,从而添加了大量缓存未命中,从而增加了更多的时间。
另一方面,如果你有一个固定的线程数量,等于内核的数量(有时甚至建议是N-1 ),你可以在用户级调度程序中管理“任务”或客户端,这可能会在你的程序中引起更多的计算,但避免了大量的操作系统进程和内存管理,使整个执行速度更快。当前的一些并行API,如.Net任务并行库、OpenMP、Intel线程构建块或Cilk,都体现了这种称为动态多线程的并行模型。
https://stackoverflow.com/questions/14390655
复制相似问题