Linux sched_setaffinity
C 最小可运行示例
在这个例子中,我们获取了affinity,修改它,并检查它是否已经生效sched_getcpu()
。
主程序
#define _GNU_SOURCE
#include <assert.h>
#include <sched.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
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);
}
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;
}
GitHub 上游.
编译并运行:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.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
所以我们看到它从一开始就限制了亲和力。
这是因为亲和性是由子进程继承的,即taskset
分叉:如何防止子分叉进程继承 CPU 亲和性?
在 Ubuntu 16.04 中测试。
x86 裸机
如果你是那个铁杆:多核汇编语言是什么样的?
Linux如何实现它
sched_setaffinity() 是如何工作的?
蟒蛇:os.sched_getaffinity
和os.sched_setaffinity
请参阅:如何使用 python 找出 CPU 的数量