pthread_setaffinity_np, pthread_getaffinity_np - Définir et obtenir
l'affinité CPU d'un thread
Bibliothèque de threads POSIX (
libpthread,
-lpthread)
#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);
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).
En cas de succès, ces fonctions renvoient
0 ; en cas
d'erreur, elles renvoient un code d'erreur non nul.
- 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 fil d’exécution avec pour identifiant
thread n'a pu être trouvé.
Ces fonctions sont fournies depuis la glibc 2.3.4.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
pthread_setaffinity_np(), pthread_getaffinity_np() |
Sécurité des threads |
MT-Safe |
Ces fonctions sont des extensions GNU non standard ; d'où le
suffixe « _np » (non portable) dans leur nom.
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.
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 <err.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
int s;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* Set affinity mask to include CPUs 0 to 7. */
CPU_ZERO(&cpuset);
for (size_t j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpuset), &cpuset);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_setaffinity_np");
/* Check the actual affinity mask assigned to the thread. */
s = pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (size_t j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %zu\n", j);
exit(EXIT_SUCCESS);
}
sched_setaffinity(2),
CPU_SET(3),
pthread_attr_setaffinity_np(3),
pthread_self(3),
sched_getcpu(3),
cpuset(7),
pthreads(7),
sched(7)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Frédéric Hantrais <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]