NOM¶
mbind - Définir 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.
DESCRIPTION¶
mbind() configure la politique mémoire NUMA, qui consiste en un mode
de politique et zéro ou plusieurs nœuds, pour l'intervalle
mémoire démarrant à
addr et s'étalant sur
len octets. La politique mémoire définit à partir de
quel nœud 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 nœuds 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 nœuds 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 nœuds
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 nœuds relatifs à l'ensemble des identifiants de
nœuds 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 nœuds. Si
la valeur de
maxnode est zéro, l'argument
nodemask est
ignoré. Quand un
nodemask est exigé, il doit contenir au
moins un nœud 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 nœud 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 nœuds.
Le mode
MPOL_BIND spécifie une politique stricte qui restreint
l'allocation mémoire aux nœuds indiqués dans
nodemask.
Si
nodemask indique plus d'un nœud, les allocations de pages se
feront d'abord à partir du nœud dont l'identifiant numérique
est le plus petit jusqu'à ce que ce nœud 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 nœud
indiqué ne contienne de mémoire libre. Il n'y aura pas d'allocation
de pages à partir de nœuds non indiqués dans
nodemask.
Le mode
MPOL_INTERLEAVE spécifie que les allocations de pages sont
entrelacées à travers l'ensemble de nœuds 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 nœuds. 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
nœud.
MPOL_PREFERRED définit le nœud préféré pour les
allocations. Le noyau essaiera d'abord d'allouer sur ce nœud, avant de ce
rabattre sur d'autres nœuds si celui‐ci n'a plus assez de
mémoire libre. Si
nodemask précise plus d'un identifiant de
nœud, le premier nœud du masque sera choisi comme le nœud
préféré. Si les paramètres
nodemask et
maxnode indique un ensemble vide, la mémoire est allouée sur
le nœud 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
mode 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
nœuds nodemask est vide. Ou, maxnode dépasse une
limite imposée par le noyau. Ou, nodemask spécifie un ou
plusieurs identifiants de nœud qui sont plus grands que l'identifiant
maximum de nœud pris en charge. Ou aucun des identifiants de
nœuds 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 nœuds 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 nœud 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.
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 nœuds. 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.44 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> ».