NOM
pthread_setaffinity_np, pthread_getaffinity_np - Définir et obtenir
l’affinité CPU d’un thread
SYNOPSIS
#define _GNU_SOURCE
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *cpuset);
Compilez et effectuez l’édition des liens avec l’option -pthread.
La fonction pthread_setaffinity_np() définit le masque d’affinité CPU
du thread thread comme étant l’ensemble de CPU pointé par cpuset. Si
l’appel réussit et que le thread n’est pas en cours d’exécution sur un
des CPU de cpuset, alors il est déplacé sur un de ces CPU.
La fonction pthread_getaffinity_np() renvoie, dans le tampon pointé par
cpuset, le masque d’affinité CPU du thread thread.
Pour plus de détails sur les masques d’affinité CPU, consultez
sched_setaffinity(2). Pour une description d’un jeu de macros qui
peuvent être utilisées pour manipuler et inspecter des ensembles de
CPU, consultez CPU_SET(3).
Le paramètre cpusetsize est la longueur (en octets) du tampon pointé
par cpuset. Typiquement, ce paramètre sera sizeof (cpu_set_t) (il peut
prendre d’autres valeurs, si on utilise les macros décrites dans
CPU_SET(3) pour allouer dynamiquement un ensemble de CPU).
VALEUR RENVOYÉE
En cas de réussite, ces fonctions renvoient 0 ; en cas d’erreur elles
renvoient un numéro d’erreur non nul.
ERREURS
EFAULT Une adresse mémoire fournie n’était pas valable.
EINVAL (pthread_setaffinity_np()) Le masque de bits d’affinité mask ne
contient pas de processeurs qui soit actuellement physiquement
sur le système et autorisé pour le thread d’après les
restrictions imposées par le mécanisme d’ensembles de CPU décrit
dans cpuset(7).
EINVAL (pthread_setaffinity_np()) Le cpuset indique un CPU en dehors de
l’ensemble pris en charge par le noyau (l’option de
configuration du noyau CONFIG_NR_CPUS définie l’intervalle de
l’ensemble pris en charge par le type de données du noyau
utilisé pour représenter les ensembles de CPU).
EINVAL (pthread_getaffinity_np()) cpusetsize est plus petit que le
taille du masque d’affinité utilisé par le noyau.
ESRCH Aucun thread avec pour identifiant thread n’a pu être trouvé.
VERSIONS
Ces fonctions sont fournies par la glibc depuis la version 2.3.4.
CONFORMITÉ
Ces fonctions sont des extensions non standard GNU ; c’est la raison du
suffixe « _np » (non portable) dans leur nom.
NOTES
Après un appel à pthread_setaffinity_np(), l’ensemble de CPU sur
lesquels le processus s’exécutera est l’intersection de l’ensemble
spécifié dans le paramètre cpuset et l’ensemble des CPU actuellement
présents sur le système. Le système peut restreindre encore plus
l’ensemble des CPU sur lesquels le processus peut tourner si le
mécanisme « cpuset », décrit dans cpuset(7), est utilisé. Ces
restrictions sur le véritable ensemble de CPU sur lesquels le processus
peut tourner sont imposées sans avertissement par le noyau.
Ces fonctions sont implémentées en utilisant les appels système
sched_setaffinity(2) et sched_getaffinity(2).
Dans la glibc 2.3.3, uniquement, les versions de ces fonctions
n’avaient pas de paramètre cpusetsize. À la place, la taille de
l’ensemble de CPU fourni à l’appel système sous-jacent était toujours
sizeof(cpu_set_t).
Un nouveau thread créé avec pthread_create() hérite d’une copie du
masque d’affinité CPU de son créateur.
EXEMPLE
Dans le programme suivant, le thread principal utilise
pthread_setaffinity_np() pour définir son masque d’affinité CPU
incluant les CPU 0 à 7 (qui peuvent ne pas être tous présents sur le
système), puis appelle pthread_getaffinity_np() pour vérifier le masque
d’affinité CPU finalement utilisé pour le thread.
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(int argc, char *argv[])
{
int s, j;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* Set affinity mask to include CPUs 0 to 7 */
CPU_ZERO(&cpuset);
for (j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");
/* Check the actual affinity mask assigned to the thread */
s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);
exit(EXIT_SUCCESS);
}
VOIR AUSSI
sched_getcpu(3), sched_setaffinity(2), sched_setscheduler(2),
pthread_attr_setaffinity_np(3), pthread_self(3), cpuset(7), pthreads(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et est maintenue par Nicolas
François <nicolas.francois@centraliens.net> et l’équipe francophone de
traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».