Um sched_setaffinity zu verwenden, um den aktuellen Prozess auf Core 7 laufen zu lassen, gehen Sie wie folgt vor:
cpu_set_t my_set; /* Define your cpu_set bit mask. */
CPU_ZERO(&my_set); /* Initialize it all to 0, i.e. no CPUs selected. */
CPU_SET(7, &my_set); /* set the bit that represents core 7. */
sched_setaffinity(0, sizeof(cpu_set_t), &my_set); /* Set affinity of tihs process to */
/* the defined mask, i.e. only 7. */
Siehe http://linux.die.net/man/2/sched_setaffinity &http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html für weitere Informationen.
Minimales lauffähiges Beispiel
In diesem Beispiel erhalten wir die Affinität, ändern sie und prüfen, ob sie mit sched_getcpu()
wirksam geworden ist .
main.c
#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-Upstream.
Kompilieren und ausführen:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Beispielausgabe:
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
Das bedeutet:
- anfänglich waren alle meine 16 Kerne aktiviert und der Prozess lief zufällig auf Kern 9 (dem 10.)
- Nachdem wir die Affinität nur auf den ersten Kern gesetzt hatten, wurde der Prozess zwangsläufig auf Kern 0 (den ersten) verschoben
Es macht auch Spaß, dieses Programm durch taskset
laufen zu lassen :
taskset -c 1,3 ./a.out
Was die Ausgabe des Formulars ergibt:
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
und so sehen wir, dass es die Affinität von Anfang an begrenzt hat.
Dies funktioniert, weil die Affinität von untergeordneten Prozessen geerbt wird, die taskset
is forking:Wie kann verhindert werden, dass die CPU-Affinität durch einen untergeordneten Forking-Prozess geerbt wird?
nproc
respektiert sched_getaffinity
standardmäßig wie gezeigt unter:How to find out the number of CPUs using python
Python:os.sched_getaffinity
und os.sched_setaffinity
Siehe:So ermitteln Sie die Anzahl der CPUs mit Python
Getestet in Ubuntu 16.04.