GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo usar sched_getaffinity y sched_setaffinity en Linux desde C?

Para usar sched_setaffinity para que el proceso actual se ejecute en Core 7, haga lo siguiente:

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

Consulte http://linux.die.net/man/2/sched_setaffinity y http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html para obtener más información.


Ejemplo ejecutable mínimo

En este ejemplo, obtenemos la afinidad, la modificamos y verificamos si ha tenido efecto con sched_getcpu() .

principal.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 ascendente.

Compilar y ejecutar:

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

Salida de muestra:

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

Lo que significa que:

  • inicialmente, todos mis 16 núcleos estaban habilitados y el proceso se ejecutaba aleatoriamente en el núcleo 9 (el décimo)
  • después de establecer la afinidad solo en el primer núcleo, el proceso se movió necesariamente al núcleo 0 (el primero)

También es divertido ejecutar este programa a través de taskset :

taskset -c 1,3 ./a.out

Lo que da salida de forma:

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

y así vemos que limitó la afinidad desde el principio.

Esto funciona porque la afinidad la heredan los procesos secundarios, que taskset se bifurca:¿Cómo evitar heredar la afinidad de la CPU por un proceso bifurcado secundario?

nproc respetos sched_getaffinity por defecto como se muestra en:Cómo averiguar la cantidad de CPU usando python

Pitón:os.sched_getaffinity y os.sched_setaffinity

Ver:Cómo averiguar la cantidad de CPU usando python

Probado en Ubuntu 16.04.


Linux
  1. Cómo instalar y usar telnet en Kali Linux

  2. ¿Qué es un comando Chown en Linux y cómo usarlo?

  3. ¿Cómo instalar y usar Linux Screen?

  4. Cómo instalar y usar Flatpak en Linux

  5. Cómo instalar y usar Traceroute en Linux

Cómo utilizar Timeshift para realizar copias de seguridad y restaurar Linux

Cómo instalar y usar el navegador Tor en Linux

Cómo instalar y usar Terminator Terminal en Linux

Cómo instalar y usar phpMyAdmin en Linux

Cómo instalar y usar el comando fd en Linux

Cómo instalar y usar Nu Shell en Linux