Article de reference

mmap

En informatique , mmap(2) `map` est un appel système Unix conforme à POSIX qui mappe des fichiers ou des périphériques en mémoire. Il s'agit d'une méthode d' entrée/sortie de fi...

En informatique , mmap(2)`map` est un appel système Unix conforme à POSIX qui mappe des fichiers ou des périphériques en mémoire. Il s'agit d'une méthode d' entrée/sortie de fichiers mappés en mémoire . Elle implémente la pagination à la demande car le contenu des fichiers n'est pas immédiatement lu depuis le disque et n'utilise initialement aucune mémoire vive physique. Les lectures depuis le disque sont effectuées après l'accès à un emplacement spécifique, de manière différée . Une fois le mappage devenu inutile, les pointeurs doivent être démappés avec `unmap` . Les informations de protection (par exemple, marquer les régions mappées comme exécutables) peuvent être gérées avec ` protected` , et un traitement spécial peut être appliqué avec `protected` .munmap(2)mprotect(2)madvise(2)

Sous Linux , macOS et les systèmes BSD , mmapil est possible de créer plusieurs types de mappages. D'autres systèmes d'exploitation ne prennent en charge qu'un sous-ensemble de ces mappages ; par exemple, les mappages partagés peuvent s'avérer peu pratiques dans un système d'exploitation dépourvu de système de fichiers virtuel global ou de cache d'E/S.

Histoire

La conception originale des fichiers mappés en mémoire provient du système d'exploitation TOPS-20mmap . Les appels système associés ont été conçus dans le cadre de la distribution logicielle Berkeley (BSD) d'Unix. Leur API était déjà décrite dans le manuel système 4.2BSD, bien qu'elle n'ait été implémentée ni dans cette version, ni dans la version 4.3BSD. Sun Microsystems avait cependant implémenté cette API dans la version 4.0 de son système d'exploitation SunOS . Les développeurs BSD de l'Université de Californie à Berkeley ont tenté, sans succès, d'obtenir de Sun le don de son implémentation ; la version 4.3BSD-Reno a donc été distribuée avec une implémentation basée sur le système de mémoire virtuelle de Mach .

Fichiers sauvegardés et anonymes

Le mappage par fichier associe une zone de la mémoire virtuelle du processus à un fichier ; autrement dit, la lecture de cette zone mémoire entraîne la lecture du fichier. Il s'agit du type de mappage par défaut.

Le mappage anonyme alloue une zone de la mémoire virtuelle du processus non associée à un fichier, accessible via l' option MAP_ANONYMOUS`--no- MAP_ANONfile`. Son contenu est initialisé à zéro. À cet égard, le mappage anonyme est similaire à `malloc` et est utilisé dans certaines implémentations de `malloc` pour certaines allocations, notamment les plus importantes.

visibilité de la mémoire

Si le mappage est partagé (l' MAP_SHAREDindicateur est activé), les écritures effectuées sur ce mappage sont visibles par les autres processus ayant mappé le même fichier. Si le mappage est partagé et associé à un fichier (et non à un MAP_ANONYMOUSautre système), l'écriture sur le support de stockage sous-jacent n'est garantie qu'après son passage à l' msync(2)appel système, mais le système peut également effacer ce support à tout moment. En revanche, si le mappage est privé (l' MAP_PRIVATEindicateur est activé), les modifications ne seront ni visibles par les autres processus ni écrites dans le fichier.

Un processus lisant ou écrivant dans le fichier sous-jacent ne verra pas toujours les mêmes données qu'un autre processus ayant mappé le fichier, car des segments du fichier sont copiés dans la RAM et seulement périodiquement écrits sur le disque. La synchronisation peut être forcée par un appel à msync(2).

L'utilisation de mmap sur les fichiers permet de réduire considérablement la consommation de mémoire pour les applications accédant au même fichier ; elles peuvent partager la zone mémoire occupée par le fichier, au lieu de le charger pour chaque application souhaitant y accéder. C'est pourquoi mmap(2) est parfois utilisé pour la communication interprocessus (IPC). Sur les systèmes d'exploitation modernes , mmap(2) est généralement préféré au mécanisme de mémoire partagée IPC de System V.

La principale différence entre la mémoire partagée System V (shmem) et les E/S mappées en mémoire (mmap) réside dans la persistance de la mémoire partagée System V : sauf suppression explicite par un processus, elle est conservée en mémoire et reste disponible jusqu’à l’arrêt du système. La mémoire mappée par mmap, quant à elle, n’est pas persistante entre les exécutions d’une application (sauf si elle est sauvegardée dans un fichier).

Exemple d'utilisation en langage de programmation C

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <err.h>#include <fcntl.h>#include <sys/types.h>#include <sys/mman.h>#include <unistd.h>/* Cet exemple montre comment un mmap de /dev/zero est équivalent à Utilisation de la mémoire anonyme (MAP_ANON) non connectée à aucun fichier. NB : MAP_ANONYMOUS ou MAP_ANON sont pris en charge par la plupart des systèmes UNIX. versions, supprimant la fonction initiale de /dev/zero.*//* Ne fonctionne pas sous OS X ou macOS, où il est impossible d'utiliser mmap sur /dev/zero */int main ( void ) {const char str1 [] = "chaîne 1" ;const char str2 [] = "chaîne 2" ;pid_t parpid = getpid ();pid_t enfantpid ;int fd = -1 ;si (( fd = open ( "/dev/zero" , O_RDWR , 0 )) == -1 ) {err ( 1 , "ouvrir" );}char * anon = ( char * ) mmap ( NULL , 4096 , PROT_READ | PROT_WRITE , MAP_ANON | MAP_SHARED , -1 , 0 );char * zéro = ( char * ) mmap ( NULL , 4096 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );si ( anonyme == MAP_FAILED || zéro == MAP_FAILED ) {errx ( 1 , "soit mmap" );}strcpy ( anonyme , str1 );strcpy ( zéro , str1 );printf ( "PID %d: anonyme %s, %s à zéro " , parpid , anon , zero );switch (( childpid = fork ())) {cas -1 :err ( 1 , "fourchette" );// non atteintcas 0 :enfantpid = obtenirpid ();printf ( "PID %d: anonyme %s, à zéro %s " , childpid , anon , zero );sommeil ( 3 );printf ( "PID %d: anonyme %s, à zéro %s " , childpid , anon , zero );munmap ( anonyme , 4096 );munmap ( zéro , 4096 );fermer ( fd );retourner EXIT_SUCCESS ;}sommeil ( 2 );strcpy ( anonyme , str2 );strcpy ( zéro , str2 );printf ( "PID %d: anonyme %s, %s à zéro " , parpid , anon , zero );munmap ( anonyme , 4096 );munmap ( zéro , 4096 );fermer ( fd );retourner EXIT_SUCCESS ;}

Exemple de résultat :

Utilisation dans les implémentations de bases de données

L'appel système mmap a été utilisé dans diverses implémentations de bases de données comme alternative à la mise en œuvre d'un pool de tampons, bien que cela ait créé un ensemble différent de problèmes qui ne pouvaient être résolus en réalité qu'à l'aide d'un pool de tampons.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index