这是一个广泛的问题,但我很好奇在具有多个物理CPU的机器上的单个进程应用程序中的线程调度的细节。
编辑 – 想澄清下面即时通讯谈论phyiscal CPU。 我在处理多核CPU的过程/线程方面有很好的把握,但是我在主板上讨论了多个物理CPU染料(如2个4核Xeon)。
回答:感谢来自brokenfoot和nosid的反馈,我想我已经得到了: – Linux调度程序有不同的NUMA策略,影响线程调度,关于它们关于内核/染料的内存突变/访问模式。 – 染料之间的caching一致性是可能的,但如预期的那样较慢。 – 最佳行动scheme – 控制共享内存的可变性(尽量不可变) – 使用一个尊重线程局部性的内部(进程内)任务调度程序 – 使用NUMA策略,与您的进程内任务调度程序
假设:
所以情况:
问题:
多个CPU之间是否可以实现高速缓存一致性? 这是否实用?
这取决于编程语言,编译器和运行时环境。 他们注意,您的程序可以使用多个CPU,并且仍然具有一致的内存操作。 为此,编程语言通常定义一个所谓的存储模型 。
linux将如何调度CPU之间的线程? (如果可能的话)
没有深入细节,它通常使用所有的CPU核心。 线程和内核之间没有静态分配。 这意味着,一个线程可以在一个核心上运行一段时间,然后在另一个核心上运行。 但是,Linux内核尝试将线程保留在内存中,因为具有多个CPU插槽的系统具有不统一的内存架构(NUMA)。
有没有办法将一个进程固定到单个CPU?
是的,寻找cpuset 。
最终…我每个CPU和引脚做一个进程吗? 或者每个盒子1个(这将是很酷的,如果我不把自己与缓慢的跨CPU缓存未命中)
如果您的应用程序受益于使用共享内存,则每个框使用一个进程。 性能方面没有劣势。