还是由操作系统控制?我听说谷歌的新Go语言有一个内置的功能,让程序员可以细化,或者我理解错了?
答案 0 :(得分:3)
由操作系统决定。
您可以使用pthread_attr_setaffinity_np()
为其设置提示。
但是操作系统可以覆盖你。上面的调用仅是您的程序对操作系统的建议。
至于Go,我还没有使用过它,甚至没有深入研究它,但我对Go的理解是很多并行性是相当隐含的。你有共同的惯例(他们说“go-routines”,非常麻烦)和他们之间的沟通。似乎CPU亲和力和线程本身的概念是独立的。也就是说,语言运行时甚至可以决定在1个CPU上完成所有操作,如果它决定最好......但是我再次提醒我,我没有太深入地看待它,所以我可能错了。 : - )
答案 1 :(得分:2)
对于linux操作系统, sched_setaffinity 是您的答案。它得到了linux kernel 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将设置 调用线程的属性,和 传递呼叫返回的值 to getpid(2)将设置属性 对于线程的主线程 组。 (如果您使用的是POSIX 线程API,然后使用 pthread_setaffinity_np(3)而不是 了sched_setaffinity()。)
答案 2 :(得分:2)
答案是肯定的,您可以通过编程方式选择运行进程的核心。正如arsane所提到的,答案在于sched_set_affinity(),然后是pthread_setaffinity_np()用于pthreads。
以下是关于如何使用流程执行此操作的nifty tutorial(来自对this问题的回答。)
基本上,这是使用位掩码完成的。这意味着有一个整数(比如32位),如果第一位== 1,则允许该进程在处理器1上运行。如果第二位== 1,则允许该进程运行处理器2.等。
因此,默认情况下,affinity bitmask = 1 ... 111(32次。)这意味着“进程可以在处理器1,2,3,...,32上运行”。当然,如果你只有2个核心,那么额外的30位将不适用。
但是,如果将该位掩码设置为:0 ... 010,则只允许“处理器2”执行该过程。
这也解释了为什么linux支持的maximum number处理器为32(开箱即用,没有调整,x86,在很多常见的硬件上,没有集群等等)。