NOM¶
sched_setaffinity, sched_getaffinity - Définir et récupérer
le masque d'affinité CPU d'un thread
SYNOPSIS¶
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
DESCRIPTION¶
Le masque d'affinité CPU d'un thread détermine l'ensemble de
processeurs sur lesquels il est susceptible de s'exécuter. Sur un
système multiprocesseur, définir le masque d'affinité CPU
permet d'obtenir une meilleure performance. Par exemple, en dédiant un
CPU à un thread particulier (c'est-à-dire définir le
masque d'affinité de ce thread pour indiquer un seul CPU, et
définir le masque d'affinité de tous les autres threads pour
exclure ce CPU), il est possible d'assurer une vitesse d'exécution
maximale pour ce thread. Restreindre un processus pour qu'il ne
s'exécute que sur un seul CPU réduit le coût lié
à l'invalidation du cache qui se produit lorsqu'un thread cesse de
s'exécuter sur un CPU puis est relancé sur un autre CPU.
Un masque d'affinité CPU est représenté par la structure
cpu_set_t, un ensemble de CPU (« CPU
set »), pointé par
mask. Des macros pour manipuler
des ensembles de CPU sont décrites dans
CPU_SET(3).
sched_setaffinity() définit le masque d'affinité CPU du
thread dont l'identifiant est
pid à la valeur donnée par
mask. Si
pid est 0, le thread appelant est utilisé.
L'argument
cpusetsize est la taille (en octets) de la structure
pointée par
mask. Normalement, cet argument doit être
spécifié comme
sizeof(cpu_set_t).
Si le thread indiqué par
pid n'est pas actuellement en cours
d'exécution sur l'un des CPU spécifiés dans
mask,
alors ce thread est migré vers l'un des CPU spécifiés
dans
mask.
La fonction
sched_getaffinity() écrit dans la structure
cpu_set_t pointée par
mask le masque de
préférences du thread
pid. L'argument
cpusetsize
indique la taille (en octets) de
mask. Si
pid vaut zéro,
le masque du thread en cours est renvoyé.
VALEUR RENVOYÉE¶
sched_setaffinity() et
sched_getaffinity() renvoient 0 s'ils
réussissent. En cas d'échec, -1 est renvoyé, et
errno contient le code d'erreur.
ERREURS¶
- EFAULT
- Une adresse mémoire fournie n'est pas correcte.
- EINVAL
- 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
- (sched_getaffinity() et, pour les noyaux antérieurs à
2.6.9, sched_setaffinity()) cpusetsize est plus petit que la
taille du masque d'affinité utilisé par le noyau.
- EPERM
- (sched_setaffinity()) Le thread appelant n'a pas les
privilèges appropriés. L'appelant doit avoir un UID effectif
égal à l'UID effectif ou réel du thread
identifié par pid, ou avoir la capacité
CAP_SYS_NICE.
- ESRCH
- Le thread numéro pid n'existe pas.
VERSIONS¶
Les appels système d'affinité ont été introduits
dans Linux 2.5.8. Les fonctions enveloppes pour ces appels système ont
été introduites dans la glibc 2.3. Au départ, les
interfaces de la glibc avaient un paramètre
cpusetsize de type
unsigned int. Dans glibc 2.3.3, ce paramètre a été
supprimé, mais il a été réintroduit dans glibc
2.3.4, avec pour type
size_t.
Ces appels système sont spécifiques à Linux.
NOTES¶
Après un appel à
sched_setaffinity(), l'ensemble de CPU sur
lesquels le thread s'exécutera est l'intersection de l'ensemble
spécifié dans le paramètre
mask 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 thread 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 thread peut tourner sont
imposées sans avertissement par le noyau.
sched_setscheduler(2) décrit les politiques d'ordonnancement sous
Linux.
Le masque d'affinité est un attribut de thread, qui peut être
modifié indépendamment pour chacun des threads d'un groupe de
threads. La valeur renvoyée par
gettid(2) peut être
passée dans l'argument
pid. Spécifier un
pid de 0
définira l'attribut pour le thread appelant, et une valeur égale
à celle renvoyée par
getpid(2) définira l'attribut
pour le thread principal du groupe de thread. (Si vous utilisez l'API POSIX
des threads, alors utilisez
pthread_setaffinity_np(3) au lieu de
sched_setaffinity().)
Un processus fils créé par
fork(2) hérite du masque
d'affinité CPU de son père. Le masque d'affinité est
conservé au travers d'un
execve(2).
Cette page de manuel décrit l'interface de la glibc pour les appels
liés à l'affinité CPU. L'interface des appels
système est légèrement différente,
mask
ayant le type
unsigned long *, montrant le fait que
l'implémentation des ensembles de CPU est en réalité un
simple masque de bits. En cas de succès, l'appel système
sched_getaffinity() brut renvoie la taille (en octets) du type
cpumask_t utilisé en interne par le noyau pour
représenter le masque d'ensemble de CPU.
VOIR AUSSI¶
taskset(1),
clone(2),
getcpu(2),
getpriority(2),
gettid(2),
nice(2),
sched_get_priority_max(2),
sched_get_priority_min(2),
sched_getscheduler(2),
sched_setscheduler(2),
setpriority(2),
CPU_SET(3),
pthread_setaffinity_np(3),
sched_getcpu(3),
capabilities(7),
cpuset(7)
COLOPHON¶
Cette page fait partie de la publication 3.65 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/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau 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> ».