上下文切换是否会导致高CPU占用?

3
我们正在分析一项性能问题,最多可能有500个工作线程,CPU使用率并不是很高。上下文切换会导致高CPU吗?换句话说,由于CPU使用率不高,上下文切换(500个线程)在这里不是问题。

这个问题太宽泛了,没有实际用途。你能详细解释一下你试图解决的问题是什么吗?这是一个理论学术问题吗? - chrylis -cautiouslyoptimistic-
这是我们开发中的一个真实性能问题。人们怀疑是否有太多的线程和上下文切换会导致性能问题。因此,我想知道如果CPU不高,我们可以说上下文切换不是很频繁吗? - goodier
1
总之,如果频率足够高,上下文切换是很昂贵的,但这个你肯定知道。你需要具体说明。 - user207421
你拥有的线程数量并不像它们需要运行的频率那样重要。 - Peter Lawrey
2个回答

4
只有在编程强制要求过多的上下文切换时,您的操作系统调度程序才会执行上下文切换,如果它认为这样做对性能有利。调度程序非常聪明,并且会限制上下文切换的数量,以避免对性能产生负面影响,如果可能的话。
然而,如果糟糕的编程阻止调度程序这样做,那么就可能出现过多的上下文切换。
例如,假设我有一个内核和500个线程。如果这500个线程每个都尝试做大量的工作,调度程序将让每个线程运行一定时间,以使上下文切换的总开销不是非常高。其中一些线程可能会看到非常高的延迟,但每个线程将运行足够长的时间,以使上下文切换不会影响性能。
但是,假设调度程序安排了第一个线程,然后在几条指令之后,该线程不再准备好运行。现在调度程序别无选择,只能切换上下文。如果下一个线程再次只运行了很短的时间,然后不再准备好运行,您将强制进行另一个上下文切换。这将导致性能下降。
强制上下文切换是不好的,调度程序选择执行的上下文切换是好的。

非常感谢你的评论,David。它非常有启发性。 - goodier

0

是的,上下文切换可能会导致性能问题,但适当的设计通常可以防止这种情况发生。一般来说,在任何时候有比可用核心更多的线程“可运行”不是非常高效的:如果几个线程正在等待某些事情发生(I/O是一个常见的例子),则可以获得性能提升,但如果您只是尝试完成大量作业,则每个核心一次执行一个任务通常会更有效率(更少的上下文切换,更少的内存开销等)。这就是为什么ExecutorService很有用:它允许您将所有作业分派到队列中,而不必担心线程机制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接