Col*_*sey 3 linux parallel-processing multithreading process linux-kernel
这是一个广泛的问题,但我很好奇在具有多个物理 CPU 的机器上的单个进程应用程序中线程调度的细节。
编辑 - 想澄清下面我在谈论物理 CPU。我已经很好地处理了进程/线程如何与多核 CPU 一起工作,但我说的是主板上的多个物理 CPU 染料(如 2 个 4 核至强)。
答案 - 多亏了 Brokenfoot 和 nosid 的回应,我想我已经明白了: - Linux 调度程序有不同的 NUMA 策略,这些策略会影响线程调度,因为它们与内核/染料有关的内存突变/访问模式。- 染料之间的缓存一致性是可能的,但速度比预期的要慢。- 最佳行动方案 - 控制共享内存的可变性(尽量保持不变) - 使用尊重线程局部性的内部(进程内)任务调度程序 - 使用与进程内任务调度程序配合使用的 NUMA 策略
假设:
所以情况:
问题:
多个 CPU 之间是否可以实现缓存一致性?实用吗?
这取决于编程语言、编译器和运行时环境。他们会注意,您的程序可以使用多个 CPU 并且仍然具有一致的内存操作。为此,编程语言通常定义所谓的内存模型。
linux 将如何调度 CPU 之间的线程?(如果可能的话)
没有详细说明,它通常使用所有 CPU 内核。线程和内核之间没有静态分配。这意味着,一个线程可以在一个内核上运行一段时间,然后在另一个内核上运行。但是,Linux 内核试图将线程保持在其内存本地,因为具有多个 CPU 插槽的系统具有非统一内存架构 (NUMA)。
有没有办法将进程固定到单个 CPU?
是的,寻找cpuset。
最终......我是否为每个 CPU 和 pin 执行一个进程?或者每盒 1 个(这会很酷,如果我不因跨 CPU 缓存未命中而自欺欺人)
如果您的应用程序受益于使用共享内存,则每个框使用一个进程。在性能方面没有缺点。