线程池会产生上下文切换开销吗?
Do thread pools incur context switch overhead?
当线程在已提交给线程池的任务之间切换时,是否会产生上下文切换开销(或类似的开销)?
没有。上下文切换是一个存储和恢复线程状态的过程。当您拥有比 CPU 支持更多的线程时,这一点很重要。这样您的 OS 就可以在少量物理线程上模拟许多线程。简单地说 more threads == more overhead
因为上下文切换必须更频繁地发生(所以我们仍然有事情并行发生的错觉)。直到它使您的系统崩溃为止。 :)
然而,当线程在任务之间切换时,这些任务必须存储在某个地方。这通常由队列完成。所以从线程的角度来看,这只是 queue.pop()
并继续处理。
现在无论队列的实现是什么,都必须保证 .pop()
操作的一致性和原子性。这样的保证总是伴随着小的(或大的,依赖于实现的)开销。
所以是的,任务之间的切换会影响性能,但这与上下文切换无关。
当线程在已提交给线程池的任务之间切换时,是否会产生上下文切换开销(或类似的开销)?
没有。上下文切换是一个存储和恢复线程状态的过程。当您拥有比 CPU 支持更多的线程时,这一点很重要。这样您的 OS 就可以在少量物理线程上模拟许多线程。简单地说 more threads == more overhead
因为上下文切换必须更频繁地发生(所以我们仍然有事情并行发生的错觉)。直到它使您的系统崩溃为止。 :)
然而,当线程在任务之间切换时,这些任务必须存储在某个地方。这通常由队列完成。所以从线程的角度来看,这只是 queue.pop()
并继续处理。
现在无论队列的实现是什么,都必须保证 .pop()
操作的一致性和原子性。这样的保证总是伴随着小的(或大的,依赖于实现的)开销。
所以是的,任务之间的切换会影响性能,但这与上下文切换无关。