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

Linux                                             11 avril 2020                                       MADVISE(2)