GNU/Linux >> Linux Esercitazione >  >> Linux

Come usare sched_getaffinity e sched_setaffinity in Linux da C?

Per utilizzare sched_setaffinity per far funzionare il processo corrente sul core 7, fai questo:

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

Vedi http://linux.die.net/man/2/sched_setaffinity e http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html per maggiori informazioni.


Esempio eseguibile minimo

In questo esempio, otteniamo l'affinità, la modifichiamo e controlliamo se ha avuto effetto con 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 a monte.

Compila ed esegui:

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

Esempio di output:

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

Il che significa che:

  • inizialmente, tutti i miei 16 core erano abilitati e il processo veniva eseguito in modo casuale sul core 9 (il decimo)
  • dopo aver impostato l'affinità solo al primo core, il processo è stato necessariamente spostato al core 0 (il primo)

È anche divertente eseguire questo programma attraverso taskset :

taskset -c 1,3 ./a.out

Che fornisce l'output del modulo:

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

e così vediamo che ha limitato l'affinità fin dall'inizio.

Funziona perché l'affinità è ereditata dai processi figli, quali taskset is fork:come impedire l'ereditarietà dell'affinità della CPU da parte di un processo fork figlio?

nproc rispetta sched_getaffinity per impostazione predefinita, come mostrato in:How to find the number of CPUs using python

Python:os.sched_getaffinity e os.sched_setaffinity

Vedi:Come scoprire il numero di CPU usando python

Testato in Ubuntu 16.04.


Linux
  1. Come installare e utilizzare telnet su Kali Linux

  2. Che cos'è un comando Chown in Linux e come usarlo

  3. Come installare e utilizzare lo schermo Linux?

  4. Come installare e utilizzare Flatpak in Linux

  5. Come installare e utilizzare Traceroute in Linux

Come utilizzare Timeshift per eseguire il backup e il ripristino di Linux

Come installare e utilizzare Tor Browser in Linux

Come installare e utilizzare Terminator Terminal in Linux

Come installare e utilizzare phpMyAdmin in Linux

Come installare e utilizzare il comando fd in Linux

Come installare e utilizzare Nu Shell su Linux