在这里搜索"线程亲和性"的答案,我看到很多人有兴趣这样做,但很少有理由这样做,可能会得到稳定的QueryPerformanceTimer结果。
假设一个现代的操作系统和一个现代的2-4个插槽的工作站/服务器级机器与现代的4-6核cpu,有什么好的理由认为他们知道比他们的操作系统的调度程序更好?在现实世界中,是否存在更多地控制大脑亲和力是正确做法的情况?可以展示哪些性能优势?
上一次我看到一个很好的设置线程关联的例子(比如,它有具体的结果支持,显示了系统性能的真正和显著的改进),是一些与Win2K设备驱动程序有关的模糊的事情。但我已经很多年没见过这样的事情了,所以当有人告诉我他们需要控制线程亲和度(但不知道为什么)时,我深感怀疑……但很好奇,否则
最主要的原因是如果您的某些东西严重依赖缓存。操作系统调度程序不一定会考虑到您可能希望的程度。
我用它来给线程分配内核;例如,在模拟中,你完全在一个核心上执行物理,并允许其余的计算在另一个核心上执行。如果你在一个严格的环境中,你知道硬件,那么能够控制这个是有意义的。
当然,配置这个需要在每个系统中完成,所以默认情况下,我让操作系统决定在哪个内核上运行,但保留限制内核使用的选项。
在操作系统内核中,有时在内核模式驱动程序中,您需要对每个CPU执行相同的操作(例如更新系统寄存器)。您可以在单个线程的循环中完成此操作,在每次迭代时更改亲和性。
对于台式机来说,这是完全没有必要的。
但是我可以看到它在一些应用中会有所帮助。例如,如果CPU缓存上运行的应用程序没有改变,它就会喜欢它。
另一种可能是你有一个关键任务——你给它一个完整的CPU,而其他任务使用剩下的CPU。
或者相反:你有一些低优先级的任务,你把它们都放在一个CPU上,然后把其他的空闲给更重要的任务(使用进程优先级会给你大部分的好处,而没有亲和关系,但我可以想象一些内存重的情况下,它不会)。
我同意在大多数情况下最好让CPU来解决这个问题。然而,据我所见,使用线程关联最常见的原因是需要良好的缓存依赖。在多CPU系统中,当一个特定的CPU为自己单独缓存某些东西时,如果相同的东西已经缓存到其他CPU中,那么我相信它可以自动在其他CPU上失效。因此,如果一个特定的线程不断改变其执行的cpu,那么缓存命中率就会太低。所以在这种情况下,我想程序员更好地判断COU亲缘关系是有意义的。我还认为Ariel上面关于确保关键任务不断获得CPU而不限制其他低优先级进程的观点也是有意义的。