我想了解上下文切换的某种最坏情况如何发生。假设我有10个CPU核心运行一个进程。一切都是CPU密集型的,没有线程正在休眠(等待I / O)。
(我主要关注的是主流的现代个人计算机架构和系统,通常是带有Windows,Linux的x64 ......)
如果我错了,请纠正我:运行10个CPU / RAM密集型独立线程通常是接近最佳的情况。在上下文切换中花费的时间量可以忽略不计。虽然系统有时可能会决定以循环方式将线程重新分配给不同的内核,从而导致RAM缓存重置,但它的影响很小,几乎就像每个线程在单个固定内核上运行一样。
只有主RAM总线可能是一个限制,因为所有线程共享它,但这不是我在这里感兴趣的点。减少线程数不会增加吞吐量。
现在假设您仍有10个内核但运行1000个线程。从理论上讲,调度程序可以决定很少(比如每秒)切换一次运行10个线程,然后再运行10个......并且整个事情仍然接近最佳性能(吞吐量)。
但似乎并非如此,看起来线程切换密集,导致性能非常不理想(吞吐量)。我是对的吗?这种次优性能的主要原因是什么?如果您对(例如)的数量级有任何想法,那么一些数字会很好:每秒开关,切换导致的性能损失......
答案 0 :(得分:0)
我会回答我自己的问题(经过一些搜索)。
在Windows上,可以使用性能计数器测量上下文切换次数:https://technet.microsoft.com/en-us/library/cc938606.aspx
我在我的机器(核心i7 / Windows 10)上进行了测量,当运行线程数超过核心数(并且这些线程是完全CPU)时,核心的数量级大约为1000 / s。
上下文切换所需的时间差别很大,具体取决于:
您可以阅读:https://www.quora.com/How-long-does-a-context-switch-take或http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
略微悲观的平均值。数量级似乎是1000 ns。因此,每个核心上所有上下文切换的总时间是每秒1毫秒,即0.1%。
这不依赖于线程数:如果运行100或1000个线程,则交换机数量不会改变。作为结论,在上下文切换中花费的时间在某种程度上可以忽略不计。
这种推理是正确的,只要线程是纯CPU,只有少量内存读/写就像一些局部变量一样。我使用完整的CPU线程运行测试,并且几个和1000个线程之间的差异不明显。
但是当涉及RAM并且交换机使CPU(内存)缓存效率降低时情况会发生变化。最糟糕的情况是:
在这种情况下,运行10个线程完成,然后其他10个......将充分利用缓存,而一次运行1000个线程将导致缓存仅在1ms内有用。
但是如果几个线程的数据可以适应缓存,或者如果线程在某种程度上读取了公共数据,或者每个线程只读取一次数据,那么运行1000个线程可能会运行10个线程一百次将具有相似的吞吐量。
更重要的是适应内存访问的并行性。这很大程度上取决于内存需要访问的方式。
在上下文切换中花费的时间可以忽略不计,由于错误使用缓存而导致的时间丢失有时可能会出现问题,有时则不会,这取决于内存的访问和共享方式。