Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       madvise - Configurer l'utilisation de la mémoire

SYNOPSIS

       #include <sys/mman.h>

       int madvise(void *addr, size_t length, int advice);

   Exigences    de    macros    de   test   de   fonctionnalités   pour   la   glibc   (consulter
   feature_test_macros(7)) :

       madvise() :
           Depuis la glibc 2.19 :
               _DEFAULT_SOURCE
           Jusqu'à la version 2.19 incluse de la glibc :
               _BSD_SOURCE

DESCRIPTION

       L'appel système madvise() est utilisé pour conseiller ou orienter  le  noyau  quant  à  la
       plage d'adresses commençant à addr et de taille length octets. Dans la plupart des cas, le
       but de tels conseils est d'améliorer les performances du système ou d'une application.

       Initialement,   l'appel   système   gérait   un   ensemble   de    valeurs    de    advice
       « conventionnelles »,  disponibles aussi sur d'autres implémentations (notez toutefois que
       madvise() n'est pas spécifié dans POSIX). Par conséquent, un certain nombre de valeurs  de
       advice spécifiques à Linux ont été ajoutées.

   Valeurs de conseil conventionnelles
       Les valeurs de advice (conseil) listées ci-dessous permettent à une application d'indiquer
       au noyau l'utilisation qu'elle compte faire de certaines  zones  de  mémoire  partagée  ou
       projetée  de façon à ce que le noyau puisse choisir les techniques de lecture anticipée et
       de mise en cache appropriées. Ces  valeurs  advice  ne  modifient  pas  la  sémantique  de
       l'application  (sauf  dans  le cas de MADV_DONTNEED), mais peuvent avoir un impact sur ses
       performances. Toutes les valeurs de advice listées ici ont un  pendant  dans  la  fonction
       posix_madvise(3)   spécifiée   par   POSIX  et  elles  ont  la  même  signification,  sauf
       MADV_DONTNEED.

       Le conseil est spécifié par le paramètre advice qui peut être un des suivants :

       MADV_NORMAL
              Pas de traitement particulier. Il s'agit du comportement par défaut.

       MADV_RANDOM
              Prévoir des références  de  page  dans  un  ordre  aléatoire.  (Ainsi,  la  lecture
              anticipée sera moins utile qu'elle ne l'est en général.)

       MADV_SEQUENTIAL
              Prévoir  des  références  de page dans un ordre séquentiel. (Aussi, les pages d'une
              plage donnée peuvent être systématiquement lues par anticipation, et  peuvent  être
              libérées rapidement après avoir été accédées.)

       MADV_WILLNEED
              Prévoir  un  accès  dans  un  futur  proche.  (Ainsi,  lire quelques pages de façon
              anticipée peut être une bonne idée.)

       MADV_DONTNEED
              Ne pas s'attendre à un accès dans un futur proche (quant  au  temps,  l'application
              est finie avec la plage donnée, pour que le noyau puisse libérer des ressources qui
              lui sont associées).

              Après une opération MADV_DONTNEED réussie, la sémantique de l'accès en mémoire dans
              la  région  indiquée  est  modifiée : les accès suivants des pages réussiront, mais
              provoqueront un nouveau remplissage de la mémoire soit avec le contenu  à  jour  du
              fichier  transposé  sous-jacent  (pour  les  tableaux  de  fichiers  partagés, ceux
              anonymes partagés, les techniques basées sur  shmem  telles  que  les  segments  de
              mémoire  partagée  de  System V), soit avec les pages remplies de zéro à la demande
              pour les tableaux privés anonymes.

              Remarquez qu'appliquée à des  tableaux  partagés,  MADV_DONTNEED  pourrait  ne  pas
              aboutir  à  une libération immédiate des pages dans la plage. Le noyau est libre de
              retarder la  libération  des  pages  jusqu'au  bon  moment.  La  mémoire  résidente
              (resident  set  size,  ou  RSS) du processus appelant sera par contre immédiatement
              réduite.

              MADV_DONTNEED ne peut pas s'appliquer à des pages  verrouillées,  d'immenses  pages
              TLB  ou  à des pages VM_PFNMAP (les pages marquées par l'attribut VM_PFNMAP interne
              au noyau sont des régions de mémoire spéciales non gérées par  le  sous-système  de
              mémoire  virtuelle.  De  telles  pages  sont généralement créées par des pilotes de
              périphérique transposant les pages dans l'espace utilisateur).

   Valeurs de conseil spécifiques à Linux
       Les  valeurs  advice  suivantes  spécifiques  à  Linux  n'ont  pas  d'équivalent  dans  le
       posix_madvise(3)  spécifié par POSIX et peuvent en avoir ou pas dans l'interface madvise()
       disponible sur d'autres implémentations. Notez que certaines de ces  opérations  modifient
       la sémantique des accès en mémoire.

       MADV_REMOVE (depuis Linux 2.6.16)
              Libération jusqu'à une plage donnée de pages et son stockage de repli associé. Cela
              revient à percer un trou dans la  plage  d'octets  correspondante  du  stockage  de
              secours  (voir  fallocate(2)).  Les  accès  suivants à la plage d'adresses indiquée
              verront des octets contenant zéro.

              Le plage d'adresses  indiquée  doit  être  transposée  partagée  et  accessible  en
              écriture.  Cet  attribut  ne  peut  pas  être  appliqué  à  des pages verrouillées,
              d'immenses pages TLB ou à des pages VM_PFNMAP.

              Dans l'implémentation initiale, seul tmpfs(5) prenait en charge MADV_REMOVE ;  mais
              depuis  Linux  3.5,  tous  les  systèmes de fichiers qui prennent en charge le mode
              FALLOC_FL_PUNCH_HOLE de fallocate(2) gèrent également MADV_REMOVE. Hugetlbfs échoue
              avec  l'erreur  EINVAL  et  d'autres  systèmes  de  fichiers échouent avec l'erreur
              EOPNOTSUPP.

       MADV_DONTFORK (depuis Linux 2.6.16)
              Ne pas rendre les pages de cette plage disponibles à  l'enfant  après  un  fork(2).
              Cela  est  utile  pour  empêcher  la  sémantique  de  copie à l'écriture de changer
              l'emplacement physique d'une page si le parent y écrit après un  fork(2)  (de  tels
              déplacements  posent  des  problèmes  si  le  matériel accède directement à la page
              (DMA)).

       MADV_DOFORK (depuis Linux 2.6.16)
              Annuler l'effet de MADV_DONTFORK et restaurer le comportement par  défaut,  où  une
              projection en mémoire est héritée après un fork(2).

       MADV_HWPOISON (depuis Linux 2.6.32)
              Empoisonner  les  pages  dans  la  plage indiquée par addr et length et traiter les
              références ultérieures à ces pages comme une corruption de la  mémoire  matérielle.
              Cette   opération   n'est   disponible   que   pour   les   processus   privilégiés
              (CAP_SYS_ADMIN). À la suite de cette opération, le processus appelant peut recevoir
              un SIGBUS et la page devenir non affectée.

              Cette  fonctionnalité  est  conçue  pour  tester  du code de gestion des erreurs de
              mémoire ;  elle  n'est  disponible  que  si  le  noyau   a   été   configuré   avec
              CONFIG_MEMORY_FAILURE.

       MADV_MERGEABLE (depuis Linux 2.6.32)
              Activer  la  fusion  des pages identiques par le noyau (Kernel Samepage Merging, ou
              KSM) pour les pages dans la plage spécifiée par addr et length.  Le  noyau  analyse
              régulièrement  les  régions  de  la  mémoire utilisateur qui ont été marquées comme
              pouvant être fusionnées, à la recherche de pages avec un contenu  identique.  Elles
              sont  remplacées par une page unique protégée en écriture (qui sera automatiquement
              recopiée si un processus veut plus tard modifier le contenu de  la  page).  KSM  ne
              fusionne que les pages anonymes privées (consultez mmap(2)).

              La  fonctionnalité  KSM est prévue pour des applications qui génèrent de nombreuses
              instances avec les mêmes données (comme les systèmes  de  virtualisation  tels  que
              KVM).  Cela consomme beaucoup de puissance de calcul ; utilisez-la prudemment. Voir
              le fichier Documentation/admin-guide/mm/ksm.rst des sources  du  noyau  Linux  pour
              plus de détails.

              Les  opérations  MADV_MERGEABLE  et  MADV_UNMERGEABLE ne sont disponibles que si le
              noyau a été configuré avec CONFIG_KSM.

       MADV_UNMERGEABLE (depuis Linux 2.6.32)
              Annuler l'effet d'une opération MADV_MERGEABLE précédente sur la  plage  d'adresses
              spécifiée ;  KSM  annule la fusion sur les pages qui avaient été fusionnées dans la
              plage spécifiée par addr et length.

       MADV_SOFT_OFFLINE (depuis Linux 2.6.33)
              Déconnecter en douceur les pages dans la plage spécifiée par  addr  et  length.  La
              mémoire  de  chaque  page  dans  la plage spécifiée est préservée (lors du prochain
              accès, le même contenu sera visible, mais dans une nouvelle page physique),  et  la
              page  originale  est  déconnectée  (ce qui signifie qu'elle n'est plus utilisée, et
              plus prise en compte par les  mécanismes  habituels  de  gestion  de  la  mémoire).
              L'effet  de  l'opération  MADV_SOFT_OFFLINE  est  invisible  au  processus appelant
              (c'est-à-dire qu'elle n'en change pas la sémantique).

              Cette fonctionnalité est conçue pour tester du  code  de  gestion  des  erreurs  de
              mémoire ;   elle   n'est   disponible   que  si  le  noyau  a  été  configuré  avec
              CONFIG_MEMORY_FAILURE.

       MADV_HUGEPAGE (depuis Linux 2.6.38)
              Activer la gestion transparente des pages immenses (Transparent Huge Pages, ou THP)
              pour  les  pages  dans  la plage spécifiée par addr et length. Actuellement, THP ne
              fonctionne qu'avec  les  pages  anonymes  privées  (consultez  mmap(2)).  Le  noyau
              analysera régulièrement les régions qui ont été marquées comme candidates aux pages
              immenses pour les remplacer par des pages immenses. Le  noyau  allouera  aussi  des
              pages  immenses directement quand la région est naturellement alignée sur la taille
              de page immense (consultez posix_memalign(2)).

              Cette fonctionnalité est d'abord destinée aux applications qui utilisent tout à  la
              fois  de  grands  tableaux,  beaucoup de données et de grandes régions d'accès à la
              mémoire (comme les systèmes de virtualisation tels que QEMU). Elle peut  facilement
              consommer  beaucoup de mémoire (par exemple un tableau de 2 Mo qui n'accède qu'à un
              octet dépensera 2 Mo de  mémoire  et  non  une  page  de  4 Ko).  Voir  le  fichier
              Documentation/admin-guide/mm/transhuge.rst  des sources du noyau Linux pour plus de
              détails.

              La plupart des configurations de noyaux classiques fournissent un comportement à la
              manière  de  MADV_HUGEPAGE par défaut, et ainsi MADV_HUGEPAGE n'est normalement pas
              nécessaire. Il est le  plus  souvent  utile  pour  les  systèmes  embarqués  où  un
              comportement  de  type  MADV_HUGEPAGE  peut  ne  pas être activé par défaut dans le
              noyau. Sur de tels systèmes, cet attribut peut être utilisé  pour  activer  THP  de
              manière sélective. À chaque fois que MADV_HUGEPAGE est utilisé, il devrait toujours
              l'être dans des régions de la mémoire où le développeur  sait  à  l'avance  que  le
              motif  d'accès  ne  risquera pas d'augmenter l'empreinte de l'application quand les
              pages immenses transparentes sont actives.

              Les opérations MADV_HUGEPAGE et MADV_NOHUGEPAGE ne sont disponibles que si le noyau
              a été configuré avec CONFIG_TRANSPARENT_HUGEPAGE.

       MADV_NOHUGEPAGE (depuis Linux 2.6.38)
              S'assurer  que  la  mémoire  dans la plage spécifiée par addr et length ne sera pas
              gérée dans des pages immenses transparentes.

       MADV_DONTDUMP (depuis Linux 3.4)
              Exclure de l'image mémoire (« core dump ») les pages dans  la  plage  indiquée  par
              addr  et  length. C'est utile pour les applications dont de larges zones de mémoire
              sont notoirement inutiles dans une image  mémoire.  L'effet  de  MADV_DONTDUMP  est
              prioritaire  sur le masque de bits configuré à l’aide de /proc/PID/coredump_filter,
              consultez core(5).

       MADV_DODUMP (depuis Linux 3.4)
              Annuler l'effet d’un MADV_DONTDUMP antérieur.

       MADV_FREE (depuis Linux 4.5)
              L'application n'a plus besoin des pages dans la plage indiquée par addr et  length.
              Le  noyau  peut ainsi libérer ces pages mais cela pourrait être différé jusqu'à une
              pression de la mémoire. Pour chacune des pages marquées comme libérables  mais  non
              encore  libérées,  l'opération sera annulée si l'appelant écrit dans la page. Après
              une opération MADV_FREE réussie, toutes  les  données  périmées  (c'est-à-dire  les
              pages  sales  ou  non  écrites)  seront  perdues quand le noyau libèrera les pages.
              Cependant, les écritures suivantes dans les pages de la plage  auront  lieu  et  le
              noyau  ne  pourra  pas  libérer  ces  pages  salies, de sorte que l'appelant pourra
              toujours voir les données qui viennent d'être écrites. S'il n'y  a  pas  d'écriture
              ultérieure, le noyau peut libérer les pages n'importe quand. Une fois que les pages
              de la plage ont été libérées, l'appelant verra des pages  remplies  de  zéro  à  la
              demande à chaque référence ultérieure aux pages.

              L'opération  MADV_FREE  ne  peut  s'appliquer qu'à des pages anonymes privées (voir
              mmap(2)). Avant Linux 4.12, avant de libérer des pages sur un système  sans  espace
              d'échange,   les  pages  dans  la  plage  donnée  étaient  libérées  instantanément
              indépendamment de la pression sur la mémoire.

       MADV_WIPEONFORK (depuis Linux 4.14
              Afficher le processus enfant avec une mémoire pleine  de  zéros  dans  cette  plage
              après un fork(2). Cela est utile quand on réplique (fork) un serveur pour s'assurer
              que les données sensibles au processus (par exemple les sièges PRNG, les  codes  de
              chiffrement et ainsi de suite) ne soient pas capturées par les processus enfants.

              L'opération MADV_WIPEONFORK ne peut s'appliquer qu'aux pages anonymes privées (voir
              mmap(2)).

              Dans l'enfant créé par fork(2), le paramètre MADV_WIPEONFORK reste en  place  à  la
              plage d'adresses indiquée. Ce paramètre est vidé lors d'un execve(2).

       MADV_KEEPONFORK (depuis Linux 4.14)
              Annuler l'effet d’un MADV_WIPEONFORK antérieur.

VALEUR RENVOYÉE

       En  cas  de  succès  madvise()  renvoie  zéro. En cas d'erreur, il renvoie -1 et errno est
       positionné de façon adéquate.

ERREURS

       EACCES advice est MADV_REMOVE, mais la plage d'adresses  indiquée  n'est  pas  un  tableau
              partagé où on peut écrire.

       EAGAIN Une ressource du noyau est temporairement indisponible.

       EBADF  La projection existe, mais la zone n'est pas associée à un fichier.

       EINVAL addr n'est pas aligné sur une page ou length est négatif.

       EINVAL advice n'est pas valable.

       EINVAL advice vaut MADV_DONTNEED ou MADV_REMOVE et la plage d'adresses indiquée inclut des
              pages verrouillées, immenses TLB ou VM_PFNMAP.

       EINVAL advice vaut MADV_MERGEABLE ou MADV_UNMERGEABLE, mais le noyau n'a pas été configuré
              avec l'option CONFIG_KSM.

       EINVAL advice  vaut  MADV_FREE ou MADV_WIPEONFORK mais la plage d'adresses indiquée inclut
              un fichier, des TLB immenses, MAP_SHARED ou des plages VM_PFNMAP.

       EIO    (pour MADV_WILLNEED) Suivre la consigne de pagination sur cette zone dépasserait la
              limite maximale de mémoire physique utilisable par le processus.

       ENOMEM (pour MADV_WILLNEED) Mémoire insuffisante ; échec de pagination.

       ENOMEM Les  adresses  de  la  plage  spécifiée  ne  sont  pas  projetées  actuellement, ou
              n'appartiennent pas à l'espace d'adressage du processus.

       EPERM  advice vaut MADV_HWPOISON, mais l'appelant n'a pas la capacité CAP_SYS_ADMIN.

VERSIONS

       Depuis Linux 3.18, la gestion de cet appel système est optionnelle, à partir  de  l'option
       de configuration CONFIG_ADVISE_SYSCALLS.

CONFORMITÉ

       madvise()  n'est  spécifié  dans  aucun  standard.  Des versions de cet appel système, qui
       implémentent une grande variété de valeurs  advice,  existent  sur  de  nombreuses  autres
       implémentations.  D'autres implémentent au moins les attributs ci-dessus sous Conventional
       advice flags (attributs de conseil conventionnels), avec d'autres variantes de sémantique.

       POSIX.1-2001   spécifie   posix_madvise(3)   avec   des   constantes    POSIX_MADV_NORMAL,
       POSIX_MADV_RANDOM,   POSIX_MADV_SEQUENTIAL,  POSIX_MADV_WILLNEED,  POSIX_MADV_DONTNEED  et
       ainsi de suite, avec un comportement proche des attributs nommés de la  même  manière  que
       ceux listés ci-dessus.

NOTES

   Notes pour Linux
       L'implémentation  Linux  nécessite que l'adresse addr soit alignée sur une page, et permet
       que length vaille zéro. S'il y a des parties de la plage d'adresses spécifiée qui ne  sont
       pas projetées, la version Linux de madvise() les ignore et applique l'appel au reste de la
       plage (mais renvoie ENOMEM comme il se doit).

VOIR AUSSI

       getrlimit(2),   mincore(2),   mmap(2),   mprotect(2),   msync(2),   munmap(2),   prctl(2),
       posix_madvise(3), core(5)

COLOPHON

       Cette  page  fait partie de la publication 5.10 du projet man-pages Linux. Une description
       du projet et des instructions pour signaler des anomalies et la dernière version de  cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La  traduction  française  de  cette  page  de  manuel  a  été créée par Christophe Blaess
       <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <stephan.rafin@laposte.net>,  Thierry
       Vignaud  <tvignaud@mandriva.com>,  François Micaux, Alain Portal <aportal@univ-montp2.fr>,
       Jean-Philippe   Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)    <jean-
       luc.coulon@wanadoo.fr>,    Julien    Cristau    <jcristau@debian.org>,    Thomas   Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau  <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis
       Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>  et  Jean-Philippe  MENGUAL
       <jpmengual@debian.org>

       Cette  traduction  est  une  documentation libre ; veuillez vous reporter à la GNU General
       Public  License  version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   concernant   les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à debian-l10n-french@lists.debian.org ⟨⟩.