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

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

编辑 – 想澄清下面即时通讯谈论phyiscal CPU。 我在处理多核CPU的过程/线程方面有很好的把握,但是我在主板上讨论了多个物理CPU染料(如2个4核Xeon)。

回答:感谢来自brokenfoot和nosid的反馈,我想我已经得到了: – Linux调度程序有不同的NUMA策略,影响线程调度,关于它们关于内核/染料的内存突变/访问模式。 – 染料之间的caching一致性是可能的,但如预期的那样较慢。 – 最佳行动scheme – 控制共享内存的可变性(尽量不可变) – 使用一个尊重线程局部性的内部(进程内)任务调度程序 – 使用NUMA策略,与您的进程内任务调度程序

假设:

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

所以情况:

  • 我有一个multithreading的单进程服务,并行处理…东西。 它可以有效利用多核心,并以一般避免cpu-corecaching缺失和一致性滥用的方式进行分割。 执行程序具有相对于任务的线程相关性。
  • 服务线程可以使用共享数据(通常是不可变的)。
  • 服务体系结构可以在同一个盒子上运行多个进程,但每个盒子只有一个进程(共享caching,资源等)是有利的。

问题:

  • 多个CPU之间是否可以实现高速caching一致性? 这是否实用? (这是性能下降)
  • linux将如何调度CPU之间的线程? (如果可能的话)
  • 有没有办法将一个进程固定到单个CPU? (确认)
  • 最终…我每个CPU和引脚做一个进程吗? 或者每个盒子1个(这很酷,如果我不把自己与缓慢的跨CPUcaching错过)(开始听起来像1进程是好的,只要我的并行任务有一定的线程和大多数不可变的数据的亲和力)

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

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

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

没有深入细节,它通常使用所有的CPU核心。 线程和内核之间没有静态分配。 这意味着,一个线程可以在一个核心上运行一段时间,然后在另一个核心上运行。 但是,Linux内核尝试将线程保留在内存中,因为具有多个CPU插槽的系统具有不统一的内存架构(NUMA)。

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

是的,寻找cpuset

最终…我每个CPU和引脚做一个进程吗? 或者每个盒子1个(这将是很酷的,如果我不把自己与缓慢的跨CPU缓存未命中)

如果您的应用程序受益于使用共享内存,则每个框使用一个进程。 性能方面没有劣势。