Provided by: manpages-fr-dev_3.65d1p1-1_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   (consultez
   feature_test_macros(7)) :

       madvise() : _BSD_SOURCE

DESCRIPTION

       L'appel système madvise() conseille le noyau sur la  façon  de  gérer  la  pagination  sur
       l'intervalle  d'adresses  débutant  à  l'adresse  addr et de taille length (en octets). Il
       permet à 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. Cet appel ne  modifie
       pas la sémantique de l'application (sauf dans le cas de MADV_DONTNEED), mais peut avoir un
       impact sur ses performances. Le noyau est libre d'ignorer le conseil.

       Le conseil est spécifié par le paramètre advice qui peut prendre les valeurs

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

       MADV_RANDOM
              Prévoit des accès aux pages 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évoit  des  accès  aux  pages  dans  un  ordre séquentiel. (Aussi, les pages d'un
              intervalle donné peuvent être systématiquement lues par  anticipation,  et  peuvent
              être libérées rapidement après avoir été accédées.)

       MADV_WILLNEED
              Prévoit  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 prévoit pas d'accès dans un futur proche. (Pour l'instant,  l'application  en  a
              fini  avec  l'intervalle  considéré,  ainsi le noyau peut‐il libérer les ressources
              associées à ce dernier.) Les accès ultérieurs aux pages de l'intervalle réussiront,
              mais  résulteront soit en un rechargement du fichier projeté sous‐jacent (consultez
              mmap(2)), soit en un remplissage avec des zéros pour les pages sans fichier.

       MADV_REMOVE (depuis Linux 2.6.16)
              Libérer  un  ensemble  contigu  de  pages  et   les   ressources   correspondantes.
              Actuellement,  ceci  n'est  possible  que  sur shmfs/tmpfs ; les autres systèmes de
              fichiers renvoient l'erreur ENOSYS.

       MADV_DONTFORK (depuis Linux 2.6.16)
              Ne pas rendre les pages de cet intervalle disponibles au  fils  après  un  fork(2).
              Ceci  est  utile  pour  empêcher  la  sémantique  de  copie à l'écriture de changer
              l'emplacement physique d'une page si le père 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)
              Empoisonne  une  page  et  la traite 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  prévue  pour
              tester  le code de gestion des erreurs de la mémoire ; elle n'est disponible que si
              le noyau a été configuré avec CONFIG_MEMORY_FAILURE.

       MADV_SOFT_OFFLINE (depuis Linux 2.6.33)
              Déconnecte les pages dans l'intervalle spécifié par addr et length. La  mémoire  de
              chaque  page  dans  l'intervalle spécifié 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 prévue pour tester
              le  code  de  gestion  des  erreurs de la mémoire ; elle n'est disponible que si le
              noyau a été configuré avec CONFIG_MEMORY_FAILURE.

       MADV_MERGEABLE (depuis Linux 2.6.32)
              Active la fusion des pages identiques par le noyau  (Kernel  Samepage  Merging,  ou
              KSM) pour les pages dans l'intervalle spécifié 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  beaucoup d'instances des mêmes
              données (par exemple des systèmes  de  virtualisation  tels  que  KVM).  Elle  peut
              nécessiter  beaucoup  de  ressources  de  traitement ;  à utiliser avec précaution.
              Consultez le fichier Documentation/vm/ksm.txt dans les 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   l'intervalle
              d'adresse  spécifié ; KSM annule la fusion sur les pages qui avaient été fusionnées
              dans l'intervalle spécifié par addr et length.

       MADV_HUGEPAGE (depuis Linux 2.6.38)
              Active la gestion transparente des pages immenses (Transparent Huge Pages, ou  THP)
              pour  les pages dans l'intervalle spécifié 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
              initialement  prévue  pour des applications qui utilisent de grosses projections de
              données et accèdent à de grosses zones de cette mémoire en même temps (par  exemple
              les  systèmes  de  virtualisation  comme  QEMU).  Il peut très facilement gaspiller
              beaucoup de mémoire (par exemple une projection de 2 Mo qui n'accède qu'à  un  seul
              octet  a  pour  conséquence  2 Mo de mémoire connectée au lieu d'une page de 4 ko).
              Consultez le fichier Documentation/vm/ktranshuge.txt  dans  les  sources  du  noyau
              Linux pour plus de détails. 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'assure que la mémoire dans l'intervalle spécifié par addr et length ne  sera  pas
              perdue dans des pages immenses.

       MADV_DONTDUMP (depuis Linux 3.4)
              Exclue  de  l'image mémoire (« core dump ») les pages dans l'intervalle indiqué 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é  via   /proc/PID/coredump_filter,
              consultez core(5).

       MADV_DODUMP (depuis Linux 3.4)
              Annuler l'effet de MADV_DONTDUMP.

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

       EAGAIN Une ressource du noyau est temporairement indisponible.

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

       EINVAL Cette erreur peut survenir pour les raisons suivantes :

              *  La valeur len est négative.

              *  addr n'est pas aligné sur une page.

              *  advice n'a pas une valeur valide.

              *  L'application tente  de  libérer  des  pages  verrouillées  ou  partagées  (avec
                 MADV_DONTNEED).

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

       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  l'intervalle  spécifié  ne  sont  pas projetées actuellement, ou
              n'appartiennent pas à l'espace d'adressage du processus.

CONFORMITÉ

       POSIX.1b.   POSIX.1-2001   spécifie   l'appel   posix_madvise(3)   avec   des   constantes
       POSIX_MADV_NORMAL,  POSIX_MADV_RANDOM, etc. et un comportement proche de celui décrit ici.
       Il existe un appel similaire posix_fadvise(2) pour les accès aux fichiers.

       MADV_REMOVE, MADV_DONTFORK, MADV_DOFORK, MADV_HWPOISON, MADV_MERGEABLE et MADV_UNMERGEABLE
       sont spécifiques à Linux.

NOTES

   Notes sur Linux
       L'implémentation  Linux  actuelle  (2.4.0)  perçoit  davantage cet appel système comme une
       commande que comme un conseil et est ainsi susceptible de renvoyer une erreur  quand  elle
       ne  parvient  pas  à  réaliser  ce  qu'elle  devrait  accomplir  en  réponse à ce conseil.
       (Consultez la  description  des  ERREURS  ci‐dessus.)  Il  s'agit  d'un  comportement  non
       standard.

       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 l'intervalle d'adresses  spécifié  qui  ne
       sont  pas projetées, la version Linux de madvise() les ignore et applique l'appel au reste
       de l'intervalle (mais renvoie ENOMEM comme il se doit).

VOIR AUSSI

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

COLOPHON

       Cette page fait partie de la publication 3.65 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/>.

       Stéphan Rafin (2002), Alain Portal <http://manpagesfr.free.fr/> (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> ».