sched_setaffinity
+ sched_getaffinity
пример минимального запуска C
Этот пример был извлечен из моего ответа по адресу: Как использовать sched_getaffinity и sched_setaffinity в Linux из C? Я считаю, что вопросы не являются дубликатами, поскольку этот вопрос является подмножеством этого, поскольку он спрашивает sched_getaffinity
только и не упоминает C ++.
В этом примере мы получаем сходство, изменяем его и проверяем, вступило ли оно в силу с помощью 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);
} 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
и мы видим, что это ограничивало сродство с самого начала.
Это работает, потому что сходство наследуется дочерними процессами, которые taskset
разветвляется: Как предотвратить наследование привязки процессора дочерним разветвленным процессом?
Протестировано в Ubuntu 16.04, GitHub upstream .