NOM¶
pthread_setaffinity_np, pthread_getaffinity_np - Définir et obtenir
l'affinité CPU d'un thread
SYNOPSIS¶
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#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.
DESCRIPTION¶
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'est pas correcte.
- 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.
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(3) 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_setaffinity(2),
sched_setscheduler(2),
pthread_attr_setaffinity_np(3),
pthread_self(3),
sched_getcpu(3),
cpuset(7),
pthreads(7)
COLOPHON¶
Cette page fait partie de la publication 3.44 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¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Nicolas François et l'équipe francophone de traduction de
Debian (2006-2009).
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> ».