GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verwende ich sched_getaffinity und sched_setaffinity in Linux von C aus?

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.


Linux
  1. So installieren und verwenden Sie Telnet unter Kali Linux

  2. Was ist ein Chown-Befehl unter Linux und wie wird er verwendet?

  3. Wie installiere und verwende ich den Linux-Bildschirm?

  4. So installieren und verwenden Sie Flatpak unter Linux

  5. So installieren und verwenden Sie Traceroute unter Linux

So verwenden Sie Timeshift zum Sichern und Wiederherstellen von Linux

So installieren und verwenden Sie den Tor-Browser unter Linux

So installieren und verwenden Sie das Terminator-Terminal unter Linux

So installieren und verwenden Sie phpMyAdmin unter Linux

So installieren und verwenden Sie den fd-Befehl unter Linux

So installieren und verwenden Sie Nu Shell unter Linux