Le masque d'affinité CPU d'un processus détermine l'ensemble des CPU
sur lesquelles il peut s'exécuter.
Sur un système multiprocesseurs, fixer le masque d'affinité CPU permet
d'améliorer les performances.
Par exemple, en dédiant une CPU à un processus particulier
(c'est-à-dire en fixant le masque d'affinité de ce processus
pour spécifier une seule CPU et en fixant le masque d'affinité
de tous les autres processus pour exclure cette CPU), il est
possible d'assurrer une vitesse d'exécution maximum pour ce processus.
Restreindre l'exécution d'un processus sur une seule CPU prévient
également du coût de performance provoqué par l'invalidation de cache
qui survient lorsqu'un processus cesse son exécution sur une CPU et la
recommence sur une autre CPU.
Un masque d'affinité CPU est représenté par la structure
cpu_set_t,
un « ensemble de CPU », pointée par
mask.
Quatre macros sont fournies pour manipuler les ensembles de CPU.
CPU_ZERO()
efface un ensemble.
CPU_SET()
et
CPU_CLR()
ajoute et retire, respectivement, la CPU indiquée d'un ensemble.
CPU_ISSET()
teste si la CPU fait partie d'un ensemble ;
cela est utile après le retour de
sched_getaffinity().
La première CPU disponible sur le système correspond à une valeur
cpu
de 0, la CPU suivante correspond à une valeur
cpu
de 1, et ainsi de suite.
La constante
CPU_SETSIZE
(1024) spécifie une valeur plus grande de un que le nombre maximum de CPU
qui peuvent appartenir à un ensemble de CPU.
sched_setaffinity()
fixe le masque d'affinité du processus dont l'ID est
pid
à la valeur spécifiée dans
mask.
Si
pid
vaut zéro, il s'agit du processus appelant.
L'argument
cpusetsize
est la longueur (en octet) de la donnée pointée par
mask.
Normalement, cet argument devrait être spécifié comme
sizeof(cpu_set_t).
Si le processus spécifié par
pid
n'est actuellement pas en cours d'exécution
sur l'une des CPU spécifiées dans
mask,
le processus est déplacé sur l'une des CPU spécifiées dans
mask.
sched_getaffinity()
écrit le masque d'affinité du processus dont l'ID est
pid
dans la structure
cpu_set_t
pointée par
mask.
L'argument
cpusetsize
spécifie la taille (en octet) de
mask.
Si
pid
vaut zéro, le masque du processus appelant est renvoyé.