我可以以编程的方式选择多核CPU中的哪个核心来运行我的线程吗?

16 浏览
0 Comments

我可以以编程的方式选择多核CPU中的哪个核心来运行我的线程吗?

还是由操作系统控制?我听说谷歌的新编程语言Go有内置功能,程序员可以进行如此细致的控制,或者我理解错了?

0
0 Comments

在Linux操作系统中,可以使用sched_setaffinity函数来实现对多核CPU上线程运行的控制。这个函数从Linux内核2.5.8版本开始就被支持。

sched_setaffinity函数的目的是设置一个进程的CPU亲和性掩码,即指定进程可以运行在哪些CPU核心上。通过调用sched_setaffinity函数,可以将一个cpu_set_t类型的掩码传递给目标进程,来设置进程的CPU亲和性。而sched_getaffinity函数可以用来获取进程的CPU亲和性掩码。

下面是sched_setaffinity和sched_getaffinity函数的定义和用法:

#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);

sched_setaffinity和sched_getaffinity函数可以通过pid参数来设置和获取指定进程的CPU亲和性掩码。在调用时,可以将gettid(2)函数的返回值作为pid参数传递,来设置当前线程的CPU亲和性。将0作为pid参数传递,则会设置调用线程的CPU亲和性。另外,通过调用getpid(2)函数的返回值作为pid参数,则会设置线程组的主线程的CPU亲和性。如果使用POSIX线程API,可以使用pthread_setaffinity_np(3)代替sched_setaffinity函数。

通过使用sched_setaffinity函数,开发者可以灵活地控制线程在多核CPU上运行的核心,从而优化系统性能和资源利用。

0
0 Comments

可以通过编程选择进程运行在哪个核心上。使用sched_set_affinity()函数来选择进程运行的核心,使用pthread_setaffinity_np()函数来选择线程运行的核心。通过位掩码来实现,如果位掩码的第一位为1,则进程允许在第一个核心上运行,如果第二位为1,则进程允许在第二个核心上运行,以此类推。默认情况下,位掩码为1...111(32位),表示进程可以在1号、2号、3号...32号核心上运行。如果只有2个核心,则多余的30位不适用。如果将位掩码设置为0...010,则只有2号核心能够执行该进程。这也解释了为什么Linux支持的最大处理器数量是32。

0
0 Comments

在多核CPU上,线程运行在哪个核心是由操作系统决定的。可以使用pthread_attr_setaffinity_np()函数设置线程运行的核心的提示,但是操作系统可以覆盖这个设置。对于Go语言来说,我还没有使用过或深入研究过,但我对Go的理解是,它的并行性很隐式。Go有协程(它们称之为“go-routines”),并且可以在它们之间进行通信。似乎CPU亲和性和线程的概念与此无关。也就是说,语言运行时甚至可以决定在一个CPU上运行所有任务,如果它认为这样做是最好的... 但是,我要警告说我对Go的了解还不够深入,所以我可能是错的。

0