在具有多个(物理)CPU的系统上的多线程进程中,如何处理线程调度?

时间:2014-03-09 18:10:59

标签: linux multithreading process parallel-processing linux-kernel

有一个广泛的问题,但我对在具有多个物理CPU的机器上的单个流程应用程序中的线程调度的细节感到好奇。

编辑 - 想澄清下面我正在讨论的物理CPU。我已经很好地处理了一个进程/线程如何与多核CPU一起工作,但我在说主板上有多个物理CPU染料(比如2个4核Xeons)。

答案 - 感谢来自brokenfoot和nosid的回复,我想我已经得到了它:   - Linux调度程序具有不同的NUMA策略,这些策略会影响有关核心/染色的内存突变/访问模式的线程调度。   - 染料之间的高速缓存一致性是可能的,但是如预期的那样慢。   - 最佳行动方案 - 控制共享内存的可变性(尝试不可变)   - 使用尊重线程局部性的内部(进程内)任务调度程序   - 使用适用于进程内任务计划程序的NUMA策略

假设:

  • 缓存一致性是允许多个内核在共享内存上运行的神奇之处。 (确认)
  • 据我所知,多个CPU可以实现缓存一致性,但性能降低(Linux 3+,系统有多个现代多核Xeon CPU)。 (确认)

所以情况:

  • 我有一个多线程的单一流程服务,可以并行执行...它可以有效地利用多个内核并以一种通常避免cpu-core缓存未命中和一致性滥用的方式进行分解。 Executor对任务具有相对线程关联性。
  • 服务线程可以在此过程中使用共享数据(通常是不可变的)。
  • 服务架构的完成方式是可以在同一个盒子上运行多个进程,但每个盒子只有一个进程(共享缓存,资源等)是有利的。

问题:

  • 多个CPU之间是否可以实现缓存一致性?这是实用的吗? (这是降低的性能)
  • linux如何安排CPU之间的线程? (如果可能的话)
  • 有没有办法将进程固定到单个CPU? (确认)
  • 最终......我是否按CPU和引脚执行一个过程?或者每盒1个(这将是很酷的,如果我不会因为缓慢的跨CPU缓存未命中而搞砸了)(开始听起来像1个进程是好的,只要我的并行任务对某个线程和大多数不可变数据有亲和力)

1 个答案:

答案 0 :(得分:4)

  

多个CPU之间是否可以实现缓存一致性?这是否实用?

由编程语言,编译器和运行时环境决定。他们注意,您的程序可以使用多个CPU并且仍然具有一致的内存操作。为此,编程语言通常定义所谓的内存模型

  

linux如何调度CPU之间的线程? (如果可能的话)

没有详细说明,它通常使用所有CPU核心。线程和核心之间没有静态分配。这意味着,一个线程可以在一个核心上运行一段时间,然后在另一个核心上运行。但是,Linux内核试图将线程保持在其内存本地,因为具有多个CPU套接字的系统具有非均匀内存架构(NUMA)。

  

有没有办法将进程固定到单个CPU?

是的,请查找 cpuset

  

最终......我是否按CPU和引脚执行一个过程?或者每盒1个(如果我不使用缓慢的跨CPU缓存未命中,那将会很酷)

如果您的应用程序受益于使用共享内存,请为每个框使用一个进程。在性能方面没有缺点。