我可以以编程方式select和select我的线程应该在哪个核心的多核心CPU上运行?

还是由操作系统控制? 我听说Google提供的Go语言具有内置的function,可以帮助程序员细化,或者我理解错了吗?

Solutions Collecting From Web of "我可以以编程方式select和select我的线程应该在哪个核心的多核心CPU上运行?"

对于Linux操作系统, sched_setaffinity是你的答案。 从Linux内核2.5.8开始支持。

名称

sched_setaffinity,sched_getaffinity – 设置并获取进程的CPU关联掩码

#define _GNU_SOURCE #include <sched.h> int sched_setaffinity( pid_t pid, size_t cpusetsize, cpu_set_t *mask); int sched_getaffinity( pid_t pid, size_t cpusetsize, cpu_set_t *mask); 

亲和性掩码实际上是每个线程属性,可以针对线程组中的每个线程独立调整。 从调用gettid(2)返回的值可以在参数pid中传递。 将pid指定为0将为调用线程设置属性,并将调用返回的值传递给getpid(2)将设置线程组的主线程的属性。 (如果使用POSIX线程API,则使用pthread_setaffinity_np(3)而不是sched_setaffinity()。)

这是由操作系统决定的。

您可以使用pthread_attr_setaffinity_np()为其设置提示。

但操作系统可以覆盖你。 上面的调用只是您的程序对操作系统的建议。

至于Go,我还没有用过它,甚至对它进行过深入的研究,但是我对Go的理解是很多的并行性是隐含的。 你们有共同的例程(他们说“例行公事”,非常小心),以及他们之间的沟通。 CPU亲和性和线程本身的概念似乎是分开的。 也就是说,语言运行时甚至可以决定在1个CPU上做到这一点,如果它决定最好的…但是,我再次警告我没有看得太深,所以我可能是错的。 🙂

答案是肯定的,你可以以编程方式选择进程运行的核心。 正如arsane提到的,答案在于sched_set_affinity(),然后是pthreads的pthread_setaffinity_np()。

这里是一个关于如何做到这一点与流程(来自这个问题的答案)的漂亮教程 。

基本上,这是使用位掩码完成的。 这意味着有一个整数(比如说32位),如果第一个位== 1,那么该进程被允许在处理器1上运行。如果第二个位== 1,那么该进程被允许运行处理器2等

因此,默认情况下,亲和位掩码= 1 … 111(32次)。这意味着“该进程可能在处理器1,2,3,…,32上运行”。 当然,如果你只有2个内核,那么额外的30位将不适用。

但是,如果将该位掩码设置为:0 … 010,则只允许“处理器2”执行该过程。

这也解释了为什么Linux支持的最大处理器数量是32(在没有调整x86的情况下,在大多数常见的硬件上,没有集群等)。