sched_setaffinity
+
sched_getaffinity
最小C可运行示例
在这个例子中,我们得到了关联,修改它,并检查它是否在
sched_getcpu()
.
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
void print_affinity() {
cpu_set_t mask;
long nproc, i;
if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
perror("sched_getaffinity");
assert(false);
} else {
nproc = sysconf(_SC_NPROCESSORS_ONLN);
printf("sched_getaffinity = ");
for (i = 0; i < nproc; i++) {
printf("%d ", CPU_ISSET(i, &mask));
}
printf("\n");
}
}
int main(void) {
cpu_set_t mask;
print_affinity();
printf("sched_getcpu = %d\n", sched_getcpu());
CPU_ZERO(&mask);
CPU_SET(0, &mask);
if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
perror("sched_setaffinity");
assert(false);
}
print_affinity();
/* TODO is it guaranteed to have taken effect already? Always worked on my tests. */
printf("sched_getcpu = %d\n", sched_getcpu());
return EXIT_SUCCESS;
}
编译和运行时使用:
gcc -std=c99 main.c
./a.out
样品输出:
sched_getaffinity = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
sched_getcpu = 9
sched_getaffinity = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sched_getcpu = 0
这意味着:
最初,我的16个内核都被启用了,进程随机运行在核心9(第10个)上。
在我们将亲和力设置为仅第一个核心之后,这个过程就必须移动到核心0(第一个)
运行这个程序也很有趣
taskset
:
taskset -c 1,3 ./a.out
其输出形式为:
sched_getaffinity = 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
sched_getcpu = 2
sched_getaffinity = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sched_getcpu = 0
所以我们看到它从一开始就限制了亲和力。
在Ubuntu 16.04中测试,
GitHub upstream
.