NOM
mbind - Fixer la politique mémoire pour une zone de mémoire
SYNOPSIS
#include <numaif.h>
int mbind(void *addr, unsigned long len, int mode,
unsigned long *nodemask, unsigned long maxnode,
unsigned flags);
Effectuez l’édition des liens avec l’option -lnuma.
mbind() configure la politique mémoire NUMA, qui consiste en un mode de
politique et zéro ou plusieurs noeuds, pour l’intervalle mémoire
démarrant à addr et s’étalant sur len octets. La politique mémoire
définit à partir de quel noeud la mémoire sera allouée.
Si la plage mémoire spécifiée par les paramètres addr et len inclut une
région « anonyme » de mémoire (c’est-à-dire une région de mémoire créée
avec l’appel système mmap(2) et l’attribut MAP_ANONYMOUS) ou un fichier
de mémoire projetée, projection créée en utilisant l’appel système
mmap(2) et l’attribut MAP_PRIVATE, les pages seront seulement allouées
conformément à la politique spécifiée lorsque l’application écrit
[stocke] dans la page. Pour les régions anonymes, un accès initial en
lecture utilisera une page partagée du noyau contenant des zéros. Pour
un fichier projeté avec MAP_PRIVATE, un accès initial en lecture
allouera des pages conformément à la politique de processus du
processus qui a fait que cette page ait été allouée. Cela peut ne pas
être le processus qui a appelé mbind().
La politique spécifiée sera ignorée pour toute projection MAP_SHARED
dans la plage mémoire spécifiée. Plutôt, les pages seront allouées
conformément à la politique de processus du processus qui a fait que la
page ait été allouée. Cela peut ne pas être le processus qui a appelé
mbind().
Si la plage de mémoire spécifiée inclut une région de mémoire partagée
créée avec l’appel système shmget(2) et attachée avec l’appel système
shmat(2), les pages allouées pour la région de mémoire anonyme ou
partagée seront allouées conformément à la politique spécifiée, sans se
soucier de quel processus attaché au segment de mémoire partagé a
provoqué l’allocation. Si toutefois la région de mémoire partagée a été
créée avec l’attribut SHM_HUGETLB, les grosses pages seront allouées
conformément à la politique spécifiée seulement si l’allocation de
pages est provoquée par le processus qui a appelé mbind() pour cette
région.
Par défaut, mbind() n’a d’effet que sur les nouvelles allocations ; si
des pages dans l’intervalle ont déjà été accédées avant de configurer
la politique, alors la politique n’a pas d’effet. Ce comportement par
défaut peut être écrasé par les attributs MPOL_MF_MOVE et
MPOL_MF_MOVE_ALL décrits plus loin.
Le paramètre mode doit spécifier l’un des attributs parmi MPOL_DEFAULT,
MPOL_BIND, MPOL_INTERLEAVE et MPOL_PREFERRED. Toutes les modes de
politique excepté MPOL_DEFAULT nécessitent que l’appelant spécifie,
dans le paramètre nodemask, les noeuds auxquels s’appliquent le mode.
Le paramètre mode peut aussi inclure un drapeau de mode optionnel. Les
drapeaux de mode pris en charges sont :
MPOL_F_STATIC_NODES (depuis Linux 2.6.26)
Un paramètre nodemask non vide indique des identifiants des
noeuds physiques. Linux ne réassocie pas nodemask quand le
processus change de contexte d’ensemble de processeurs ou après
une modifications de l’ensemble de noeuds autorisés pour le
contexte de l’ensemble de processeurs en cours pour le
processus.
MPOL_F_RELATIVE_NODES (depuis Linux 2.6.26)
Un paramètre nodemask non vide indique des identifiants des
noeuds relatifs à l’ensemble des identifiants de noeuds
autorisés pour le contexte de l’ensemble de processeurs en cours
pour le processus.
nodemask pointe sur un masque de bits qui contient jusqu’à maxnode
bits. La taille du masque de bits est arrondi au multiple supérieur de
sizeof(unsigned long), mais le noyau n’utilisera que jusqu’à maxnode
bits. Une valeur NULL pour nodemask ou une valeur maxnode de zéro
indique un ensemble vide de noeuds. Si la valeur de maxnode est zéro,
l’argument nodemask est ignoré. Quand un nodemask est exigé, il doit
contenir au moins un noeud de connecté, autorisés dans le contexte de
l’ensemble de processeurs du processus appelant (à moins que le drapeau
MPOL_F_STATIC_NODES ne soit fourni) et doit contenir de la mémoire.
Le mode MPOL_DEFAULT demande à ce que toute politique n’étant pas une
politique par défaut soit retirée, ce qui restaure le comportement par
défaut. Lorsqu’il est appliqué à une plage mémoire via mbind(), cela
signifie d’utiliser la politique du processus qui peut être modifiée
avec set_mempolicy(2). Si le mode de la politique de processus est
également MPOL_DEFAULT, la politique par défaut du système sera
utilisée. La politique par défaut du système alloue des pages sur le
noeud de la CPU qui a déclenché l’allocation. Pour MPOL_DEFAULT, les
paramètres nodemask et maxnode doivent spécifier l’ensemble vide de
noeuds.
Le mode MPOL_BIND spécifie une politique stricte qui restreint
l’allocation mémoire aux noeuds indiqués dans nodemask. Si nodemask
indique plus d’un noeud, les allocations de pages se feront d’abord à
partir du noeud dont l’identifiant numérique est le plus petit jusqu’à
ce que ce noeud ne contienne plus de mémoire libre. Les allocations se
feront ensuite à partir du node dont l’identifiant est le prochain plus
grand spécifié dans nodemask et ainsi de suite jusqu’à ce que plus un
seul noeud indiqué ne contienne de mémoire libre. Il n’y aura pas
d’allocation de pages à partir de noeuds non indiqués dans nodemask.
Le mode MPOL_INTERLEAVE spécifie que les allocations de pages sont
entrelacées à travers l’ensemble de noeuds spécifiés dans nodemask.
Cela optimise la bande passante au lieu de la latence en étalant les
pages et l’accès mémoires à ces pages à travers plusieurs noeuds. Pour
être efficace, la zone mémoire doit être relativement grande, au moins
1 Mo ou plus avec un modèle d’accès assez uniforme. Les accès à une
unique page de la zone seront toujours limités à la bande passante d’un
seul noeud.
MPOL_PREFERRED fixe le noeud préféré pour les allocations. Le noyau
essaiera d’abord d’allouer sur ce noeud, avant de ce rabattre sur
d’autres noeuds si celui‐ci n’a plus assez de mémoire libre. Si
nodemask précise plus d’un identifiant de noeud, le premier noeud du
masque sera choisi comme le noeud préféré. Si les paramètres nodemask
et maxnode indique un ensemble vide, la mémoire est allouée sur le
noeud du CPU qui a déclenché l’allocation. C’est la seule façon
d’indiquer une « allocation locale » pour une plage mémoire avec
mbind().
Si l’option MPOL_MF_STRICT est passée dans flags et si policy n’est pas
MPOL_DEFAULT, l’appel échoue avec l’erreur EIO si les pages existantes
dans la projection ne suivent pas la politique.
Si MPOL_MF_MOVE est passé dans flags, le noyau essaiera de déplacer
toutes les pages de la projection pour qu’elles suivent la politique.
Les pages partagées avec d’autres processus ne sont pas déplacées. Si
MPOL_MF_STRICT est également indiqué, l’appel échouera avec l’erreur
EIO si certaines pages ne peuvent pas être déplacées.
Si MPOL_MF_MOVE_ALL est indiqué dans flags, alors le noyau essaiera de
déplacer toutes les pages de la projection, même si d’autres processus
les utilisent. Le processus appelant doit être privilégié (avoir la
capacité CAP_SYS_NICE) pour utiliser cette option. Si MPOL_MF_STRICT
est également utilisé, l’appel renverra l’erreur EIO si certaines pages
ne peuvent pas être déplacées.
VALEUR RENVOYÉE
S’il réussit, mbind() renvoie zéro. En cas d’erreur, il renvoie -1 et
remplit errno avec la valeur d’erreur.
ERREURS
EFAULT Une partie ou toute la plage mémoire spécifiée par nodemask et
maxnode pointe en dehors de votre espace d’adressage accessible.
Ou il y a un trou non projeté dans l’intervalle mémoire
spécifié.
EINVAL Une valeur non valable a été spécifiée pour flags ou mode ; ou
addr + len est plus petite que addr ; ou addr n’est pas un
multiple de la taille de page système. Ou, mode est MPOL_DEFAULT
et nodemask spécifiait un ensemble non vide ; ou mode était
MPOL_BIND ou MPOL_INTERLEAVE et le masque de noeuds nodemask est
vide. Ou, maxnode dépasse une limite imposée par le noyau. Ou,
nodemask spécifie un ou plusieurs identifiants de noeud qui sont
plus grands que l’identifiant maximum de noeud pris en charge.
Ou aucun des identifiants de noeuds spécifiés par nodemask ne
sont connectés et autorisés dans le contexte de l’ensemble de
processeurs du processus appelant, ou aucun des noeuds spécifiés
ne contient de mémoire. Ou le paramètre mode indiquait à la fois
MPOL_F_STATIC_NODES et MPOL_F_RELATIVE_NODES.
EIO MPOL_MF_STRICT a été utilisé et une page existante était déjà
sur un noeud ne suivant pas la politique ; ou soit MPOL_MF_MOVE
soit MPOL_MF_MOVE_ALL a été spécifié et le noyau n’a pas été
capable de déplacer toutes les pages existantes dans la plage.
ENOMEM Pas assez de mémoire pour le noyau.
EPERM Le paramètre flags inclus l’attribut MPOL_MF_MOVE_ALL et
l’appelant n’a pas le privilège CAP_SYS_NICE.
VERSIONS
L’appel système mbind() a été ajouté au noyau Linux dans la version
2.6.7.
CONFORMITÉ
Cet appel système est spécifique à Linux.
NOTES
Pour des informations sur la prise en charge par des bibliothèques,
consultez numa(7).
La politique NUMA n’est pas supportée sur les plages de fichiers de
mémoire projetée qui ont été projetées avec l’attribut MAP_SHARED.
Le mode MPOL_DEFAULT peut avoir des effets différents sur mbind() et
sur set_mempolicy(2). Lorsque MPOL_DEFAULT est spécifié pour
set_mempolicy(2), la politique du processus est remise à la politique
par défaut du système ou l’allocation locale. Lorsque MPOL_DEFAULT est
spécifié pour une plage de mémoire utilisant mbind(), toutes les pages
allouées par la suite pour cette plage utiliseront la politique du
processus telle qu’elle a été définie par set_mempolicy(2). Cela
supprime de manière effective la politique explicite de la plage
spécifiée, ce qui peut éventuellement remettre une politique autre que
celle par défaut. Pour choisir explicitement une « allocation locale »
pour une plage mémoire, spécifiez mode avec MPOL_PREFERRED avec un
ensemble vide de noeuds. Cette méthode fonctionnera aussi avec
set_mempolicy(2).
La gestion de politique pour les pages immenses a été ajoutée dans le
noyau 2.6.16. Pour que la politique d’entrelacement soit efficace sur
les projections de pages immenses, la taille de la zone mémoire doit
être au moins de dizaines de mégaoctets.
MPOL_MF_STRICT est ignoré sur les projections de pages immenses.
MPOL_MF_MOVE et MPOL_MF_MOVE_ALL ne sont disponibles qu’à partir de
Linux 2.6.16.
VOIR AUSSI
get_mempolicy(2), getcpu(2), mmap(2), set_mempolicy(2), shmat(2),
shmget(2), numa(3), cpuset(7), numa(7), numactl(8)
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 mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> 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> ».