GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser sched_getaffinity et sched_setaffinity sous Linux à partir de C ?

Pour utiliser sched_setaffinity pour exécuter le processus actuel sur le noyau 7, procédez comme suit :

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. */

Voir http://linux.die.net/man/2/sched_setaffinity &http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html pour plus d'informations.


Exemple exécutable minimal

Dans cet exemple, nous obtenons l'affinité, la modifions et vérifions si elle a pris effet avec sched_getcpu() .

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 en amont.

Compiler et exécuter :

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Exemple de sortie :

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

Ce qui signifie que :

  • initialement, tous mes 16 cœurs étaient activés et le processus s'exécutait de manière aléatoire sur le cœur 9 (le 10e)
  • après avoir défini l'affinité uniquement sur le premier cœur, le processus a été déplacé nécessairement vers le cœur 0 (le premier)

Il est également amusant d'exécuter ce programme via taskset :

taskset -c 1,3 ./a.out

Ce qui donne une sortie de formulaire :

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

et donc on voit que ça a limité l'affinité dès le départ.

Cela fonctionne car l'affinité est héritée par les processus enfants, qui taskset is forking :comment empêcher l'héritage de l'affinité CPU par le processus enfant dérivé ?

nproc respecte sched_getaffinity par défaut comme indiqué sur :Comment connaître le nombre de processeurs en utilisant python

Python :os.sched_getaffinity et os.sched_setaffinity

Voir :Comment connaître le nombre de processeurs en utilisant python

Testé dans Ubuntu 16.04.


Linux
  1. Comment installer et utiliser telnet sur Kali Linux

  2. Qu'est-ce qu'une commande Chown sous Linux et comment l'utiliser

  3. Comment installer et utiliser Linux Screen ?

  4. Comment installer et utiliser Flatpak sous Linux

  5. Comment installer et utiliser Traceroute sous Linux

Comment utiliser Timeshift pour sauvegarder et restaurer Linux

Comment installer et utiliser le navigateur Tor sous Linux

Comment installer et utiliser Terminator Terminal sous Linux

Comment installer et utiliser phpMyAdmin sous Linux

Comment installer et utiliser la commande fd sous Linux

Comment installer et utiliser Nu Shell sous Linux