Loading

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> ».