Provided by: manpages-fr-dev_4.19.0-7_all bug

NOM

       mlock, mlock2, munlock, mlockall, munlockall - Verrouiller et déverrouiller la mémoire

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/mman.h>

       int mlock(const void addr[.len], size_t len);
       int mlock2(const void addr[.len], size_t len, unsigned int flags);
       int munlock(const void addr[.len], size_t len);

       int mlockall(int flags);
       int munlockall(void);

DESCRIPTION

       mlock(),  mlock2()  et  mlockall()  verrouillent tout ou partie de l'espace d'adressage du
       processus appelant dans la mémoire physique pour empêcher  cette  mémoire  d'être  évincée
       dans l'espace d'échange (swap).

       munlock() et munlockall() ont l'effet inverse, respectivement déverrouillant une partie ou
       l'ensemble de l'espace d'adressage du processus appelant, afin que les pages dans la  zone
       indiquée  puissent  à  nouveau être évincées dans l'espace d'échange si le gestionnaire de
       mémoire du noyau l'exige.

       Le verrouillage et le déverrouillage de la mémoire s'effectuent sur  des  unités  de  page
       entière.

   mlock(), mlock2() et munlock()
       mlock()  verrouille  les pages sur len octets à partir de l'adresse addr. Toutes les pages
       qui contiennent une partie de la zone mémoire indiquée  ont  la  garantie  de  résider  en
       mémoire  principale  quand  l'appel  réussit ;  elles ont la garantie de rester en mémoire
       principale jusqu'à leur déverrouillage.

       mlock() verrouille aussi les pages de la  plage  indiquée  sur  len  octets  à  partir  de
       l'adresse  addr.  Néanmoins,  l'état  des  pages contenues dans cette plage après un appel
       réussi dépendra de la valeur du paramètre flags.

       L'argument flags peut être 0 ou la constante suivante :

       MLOCK_ONFAULT
              Verrouiller les pages actuellement résidentes et marquer toute la plage pour que le
              reste des pages non résidentes se verrouillent quand elles se remplissent d'erreurs
              de pagination.

       Si flags vaut 0, mlock2() se comporte exactement comme mlock().

       munlock() déverrouille la mémoire sur len octets à partir de  l'adresse  addr.  Après  cet
       appel,  toutes  les  pages  contenant  une  partie  de la zone mémoire indiquée peuvent de
       nouveau être évincées dans l'espace d'échange par le noyau.

   mlockall() et munlockall()
       mlockall() verrouille toutes les pages projetées dans l'espace  d'adressage  du  processus
       appelant.  Cela  inclut  les  pages  de  code,  de  données  et  de  pile,  ainsi  que les
       bibliothèques partagées, les données utilisateur dans le noyau, la  mémoire  partagée,  et
       les fichiers projetés en mémoire. Toutes les pages projetées ont la garantie de résider en
       mémoire principale quand l'appel réussit ; elles ont la  garantie  de  rester  en  mémoire
       principale jusqu'à leur déverrouillage.

       L'argument flags est composé d'un OU binaire avec les options suivantes :

       MCL_CURRENT
              Verrouiller  toutes  les  pages actuellement projetées dans l'espace d'adressage du
              processus.

       MCL_FUTURE
              Verrouiller toutes les pages qui seront  projetées  dans  l'espace  d'adressage  du
              processus  dans  le  futur.  Il  peut  s'agir,  par  exemple,  de  nouvelles  pages
              nécessitées par la croissance du tas  et  de  la  pile,  ou  de  nouveaux  fichiers
              projetés en mémoire, ou des zones de mémoire partagée.

       MCL_ONFAULT (depuis Linux 4.4)
              Utilisé  avec  MCL_CURRENT,  MCL_FUTURE ou les deux. Marquer toutes les projections
              actuelles (avec MCL_CURRENT) ou futures  (avec  MCL_FUTURE)  pour  verrouiller  les
              pages quand elles contiennent des erreurs. Si on l'utilise avec MCL_CURRENT, toutes
              les pages présentes sont verrouillées mais mlockall() ne rencontrera  pas  d'erreur
              sur  des  pages  non  présentes.  Quand  on  l'utilise  avec MCL_FUTURE, toutes les
              projections  futures  seront  marquées  pour  verrouiller  les  pages  quand  elles
              rencontreront  une  erreur, mais elles ne seront pas remplies par le verrou lors de
              la création de la projection.  MCL_ONFAULT  doit  être  utilisé  avec  MCL_CURRENT,
              MCL_FUTURE ou les deux.

       Si  MCL_FUTURE  a  été  utilisé,  un  appel  système  ultérieur  (p.ex.  mmap(2), sbrk(2),
       malloc(3)) risque d'échouer s'il cause  un  dépassement  du  nombre  d'octets  verrouillés
       autorisé  (voir ci‐dessous). Dans les mêmes circonstances, la croissance de la pile risque
       également d'échouer : le noyau interdira l'augmentation de la pile et  enverra  le  signal
       SIGSEGV au processus.

       munlockall()  déverrouille  toutes  les  pages  projetées  dans  l'espace  d'adressage  du
       processus appelant.

VALEUR RENVOYÉE

       S'ils réussissent, ces appels système renvoient 0. En  cas  d'erreur,  ils  renvoient  -1,
       errno  est  positionné pour indiquer l'erreur et les verrouillages de l'espace d'adressage
       du processus ne sont pas modifiés.

ERREURS

       EAGAIN (mlock(), mlock2() et munlock()) Une partie (ou l'ensemble) de l'espace d'adressage
              indiqué n'a pas pu être verrouillée.

       EINVAL (mlock(),  mlock2()  et  munlock())  La  somme  de addr+len était inférieure à addr
              (l'addition aurait pu conduire à un dépassement par exemple).

       EINVAL (mlock2()) Des flags inconnus étaient demandés.

       EINVAL (mlockall()) Des flags inconnus ont été indiqués ou MCL_ONFAULT a été indiqué  sans
              MCL_FUTURE ou MCL_CURRENT.

       EINVAL (Pas sous Linux) addr n'est pas un multiple de la taille de la page.

       ENOMEM (mlock(), mlock2() et munlock()) Une partie de la zone indiquée ne correspond pas à
              des pages projetées dans l'espace d'adressage du processus.

       ENOMEM (mlock(), mlock2() et munlock()) Le verrouillage ou le déverrouillage d'une  région
              ferait  dépasser  le  nombre  maximum  de  projections permises ayant des attributs
              distincts (comme verrouillé contre déverrouillé). Par  exemple,  le  déverrouillage
              d'une  plage  située  au milieu d'une projection actuellement verrouillée donnerait
              trois projections : deux verrouillées  de  chaque  côté  et  une  déverrouillée  au
              milieu.

       ENOMEM (Linux 2.6.9 et plus récents) L'appelant avait une limite souple RLIMIT_MEMLOCK non
              nulle, mais a tenté de verrouiller plus de mémoire que la quantité autorisée. Cette
              limite n'est pas imposée si le processus est privilégié (CAP_IPC_LOCK).

       ENOMEM (Linux 2.4  et précédents) Le processus appelant a essayé de verrouiller plus de la
              moitié de la mémoire vive.

       EPERM  L'appelant n'est pas  privilégié  mais  a  besoin  de  droits  (CAP_IPC_LOCK)  pour
              réaliser les opérations demandées.

       EPERM  (munlockall())   (Linux 2.6.8   et  précédents)  L'appelant  n'est  pas  privilégié
              (CAP_IPC_LOCK).

VERSIONS

       mlock2() est disponible depuis Linux 4.4 ; la prise en charge de la glibc  a  été  ajoutée
       depuis la glibc 2.27.

STANDARDS

       mlock(), munlock(), mlockall() et munlockall() : POSIX.1-2001, POSIX.1-2008, SVr4.

       mlock2() est spécifique à Linux.

       Sur  les  systèmes POSIX où mlock() et munlock() sont disponibles, la constante symbolique
       _POSIX_MEMLOCK_RANGE est définie dans <unistd.h> et le nombre d'octets par page peut  être
       déterminé  grâce  à  la  constante  PAGESIZE  si  définie  dans  <limits.h> ou en appelant
       sysconf(_SC_PAGESIZE).

       Sur les systèmes POSIX sur  lesquels  mlockall()  et  munlockall()  sont  disponibles,  la
       constante  symbolique  _POSIX_MEMLOCK  est  définie dans <unistd.h> comme étant une valeur
       supérieure à 0. (Consultez aussi sysconf(3).)

NOTES

       Il y a deux domaines principaux d'applications du verrouillage de pages : les  algorithmes
       en  temps  réel  et  le traitement de données confidentielles. Les applications temps réel
       réclament  un  comportement  temporel   déterministe,   et   la   pagination   est,   avec
       l'ordonnancement,  une  cause  majeure  de  délais  imprévus.  Ces  algorithmes  basculent
       habituellement sur un ordonnancement temps‐réel avec sched_setscheduler(2). Les  logiciels
       de  cryptographie  manipulent  souvent  quelques octets hautement confidentiels, comme des
       mots de passe ou des clés privées. À cause de la pagination, ces données secrètes risquent
       d'être  transférées  sur  un  support physique où elles pourraient être lues par un ennemi
       longtemps après que le logiciel se soit terminé. Soyez toutefois  conscient  que  le  mode
       suspendu  sur les portables et certains ordinateurs de bureau sauvegardent une copie de la
       mémoire sur le disque, quels que soient les verrouillages.

       Les processus temps‐réel utilisant mlockall() pour éviter les délais dus à  la  pagination
       doivent  réserver  assez de pages verrouillées pour la pile avant d'entrer dans la section
       temporellement critique, afin qu'aucun défaut de page ne  survienne  lors  d'un  appel  de
       fonction.  Cela  peut  être  obtenu  en  appelant  une  fonction  qui  alloue une variable
       automatique suffisamment grande (comme un tableau) et écrit dans la mémoire occupée par ce
       tableau  afin de modifier ces pages de pile. Ainsi, suffisamment de pages seront projetées
       pour la pile et pourront être verrouillées. Les écritures bidon  permettent  de  s'assurer
       que même les pages copiées à l'écriture ne causeront pas de défaut de page dans la section
       critique.

       Les verrouillages de mémoire ne sont pas récupérés par un enfant lors d'un fork(2) et sont
       automatiquement  supprimés (déverrouillés) au cours d'un execve(2) ou lorsque le processus
       se termine. Les paramètres MCL_FUTURE et MCL_FUTURE | MCL_ONFAULT de  mlockall()  ne  sont
       pas récupérés par un enfant créé par fork(2) et sont effacés au cours d'un execve(2).

       Remarquez que fork(2) préparera l'espace d'adressage pour une opération copie-en-écriture.
       La conséquence est que tout accès en écriture consécutif créera une erreur  de  pagination
       qui,  elle-même,  peut causer des latences importantes dans un processus en temps réel. Il
       est donc crucial de ne pas appeler fork(2) après des opérations  mlockall()  ou  mlock() ;
       même  à  partir  d'un thread qui tourne en priorité basse dans un processus dont un thread
       tourne en priorité haute.

       Le verrouillage de mémoire sur  une  zone  est  automatiquement  enlevé  si  la  zone  est
       invalidée par munmap(2).

       Il  n'y  a  pas  d'empilement  des  verrouillages  mémoire,  ce  qui  signifie qu'une page
       verrouillée plusieurs fois par des appels mlock(), mlock2() ou mlockall() sera libérée  en
       un  seul  appel  à  munlock()  pour  la  zone  mémoire  correspondante  ou  par un appel à
       munlockall(). Les pages qui sont projetées à plusieurs endroits ou par plusieurs processus
       restent  verrouillées en mémoire vive tant qu'il y a au moins un processus ou une zone qui
       les verrouille.

       Si un appel à mlockall(), qui utilise l'attribut MCL_FUTURE, est suivi  d'un  autre  appel
       qui  n'indique  pas  cet attribut, les changements effectués par l'appel MCL_FUTURE seront
       perdus.

       L'attribut MLOCK_ONFAULT de mlock2() et celui  MCL_ONFAULT  de  mlockall()  permettent  un
       verrouillage  efficace  de  la  mémoire pour les applications qui ont à faire à de grandes
       projections où seulement une (petite) partie des pages de la  projection  sont  modifiées.
       Dans  ce cas, le verrouillage de toutes les pages d'une projection risquerait une sanction
       lourde de verrouillage de mémoire.

   Notes pour Linux
       Sous Linux,  mlock(),  mlock2()  et  munlock()  arrondissent  automatiquement  addr  à  la
       frontière  de  page  la  plus proche. Toutefois, la spécification POSIX.1 de mlock() et de
       munlock() permet à l'implémentation d'imposer que addr soit alignée sur une  frontière  de
       page. Les applications portables devraient s'en assurer.

       Le  champ  VmLck  du  fichier  /proc/PID/status  spécifique  à  Linux  indique  combien de
       kilooctets de mémoire le processus d'identifiant PID a verrouillé  en  utilisant  mlock(),
       mlock2(), mlockall() et MAP_LOCKED de mmap(2).

   Limites et permissions
       Sous  Linux  2.6.8  et  précédents,  un processus doit être privilégié (CAP_IPC_LOCK) pour
       verrouiller de la mémoire et la limite souple RLIMIT_MEMLOCK  définit  le  nombre  maximal
       d'octets que le processus peut verrouiller en mémoire.

       Depuis  Linux  2.6.9,  aucune  limite n'est placée sur la quantité de mémoire pouvant être
       verrouillée par un processus privilégié, et la limite  souple  RLIMIT_MEMLOCK  définit  la
       quantité maximale de mémoire pouvant être verrouillée par un processus non privilégié.

BOGUES

       Dans  Linux  4.8  et  antérieurs,  un  bogue  dans  le  calcul  par le noyau de la mémoire
       verrouillée pour les processus non privilégiés (à savoir sans CAP_IPC_LOCK) faisait que si
       la  région  indiquée  par  addr  et  len  incluait  un  verrou  existant,  les octets déjà
       verrouillés dans la région incluante étaient comptés deux fois lors de la vérification  de
       leur  atteinte  de  limite. Un tel double comptage calculerait mal une valeur de « mémoire
       verrouillée totale » du processus qui a dépassé la  limite  RLIMIT_MEMLOCK,  si  bien  que
       mlock()  et mlock2() échoueraient sur des requêtes qui auraient dû réussir. Ce bogue a été
       corrigé dans Linux 4.9.

       Dans Linux de la  branche 2.4  des  noyaux,  jusqu'à  Linux 2.4.17  inclus,  le  paramètre
       MCL_FUTURE  de mlockall() était hérité par l'enfant après un fork(2) en raison d'un bogue.
       Cela a été corrigé dans Linux 2.4.18.

       Depuis Linux 2.6.9, si un processus privilégié appelle mlockall(MCL_FUTURE) et réduit  ses
       privilèges  plus  tard  (perd  la  capacité  CAP_IPC_LOCK,  par  exemple en prenant un UID
       effectif  non  nul),  les  allocations  de  mémoires  suivantes  (p.ex.  mmap(2),  brk(2))
       échoueront si la limite RLIMIT_MEMLOCK est dépassée.

VOIR AUSSI

       mincore(2), mmap(2), setrlimit(2), shmctl(2), sysconf(3), proc(5), capabilities(7)

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