有一个广泛的问题,但我对在具有多个物理CPU的机器上的单个流程应用程序中的线程调度的细节感到好奇。
编辑 - 想澄清下面我正在讨论的物理CPU。我已经很好地处理了一个进程/线程如何与多核CPU一起工作,但我在说主板上有多个物理CPU染料(比如2个4核Xeons)。
答案 - 感谢来自brokenfoot和nosid的回复,我想我已经得到了它: - Linux调度程序具有不同的NUMA策略,这些策略会影响有关核心/染色的内存突变/访问模式的线程调度。 - 染料之间的高速缓存一致性是可能的,但是如预期的那样慢。 - 最佳行动方案 - 控制共享内存的可变性(尝试不可变) - 使用尊重线程局部性的内部(进程内)任务调度程序 - 使用适用于进程内任务计划程序的NUMA策略
假设:
所以情况:
问题:
答案 0 :(得分:4)
多个CPU之间是否可以实现缓存一致性?这是否实用?
由编程语言,编译器和运行时环境决定。他们注意,您的程序可以使用多个CPU并且仍然具有一致的内存操作。为此,编程语言通常定义所谓的内存模型。
linux如何调度CPU之间的线程? (如果可能的话)
没有详细说明,它通常使用所有CPU核心。线程和核心之间没有静态分配。这意味着,一个线程可以在一个核心上运行一段时间,然后在另一个核心上运行。但是,Linux内核试图将线程保持在其内存本地,因为具有多个CPU套接字的系统具有非均匀内存架构(NUMA)。
有没有办法将进程固定到单个CPU?
是的,请查找 cpuset 。
最终......我是否按CPU和引脚执行一个过程?或者每盒1个(如果我不使用缓慢的跨CPU缓存未命中,那将会很酷)
如果您的应用程序受益于使用共享内存,请为每个框使用一个进程。在性能方面没有缺点。