stringtranslate.com

mapa mm

En informática , mmap(2)es una llamada al sistema Unix compatible con POSIX que asigna archivos o dispositivos a la memoria. Es un método de E/S de archivos mapeados en memoria . Implementa paginación bajo demanda porque el contenido del archivo no se lee inmediatamente desde el disco e inicialmente no utiliza ninguna RAM física. Las lecturas reales del disco se realizan después de acceder a una ubicación específica, de forma diferida . Una vez que la asignación ya no sea necesaria, los punteros se deben desasignar con . La información de protección (por ejemplo, marcar regiones mapeadas como ejecutables) se puede gestionar mediante y se puede aplicar un tratamiento especial mediante . munmap(2)mprotect(2)madvise(2)

En Linux , macOS y BSD , mmappodemos crear varios tipos de asignaciones. Es posible que otros sistemas operativos solo admitan un subconjunto de estos; por ejemplo, las asignaciones compartidas pueden no ser prácticas en un sistema operativo sin un VFS global o una caché de E/S.

Historia

El diseño original de los archivos mapeados en memoria provino del sistema operativo TOPS-20 . mmapy las llamadas a sistemas asociados se diseñaron como parte de la versión Berkeley Software Distribution (BSD) de Unix. Su API ya estaba descrita en el Manual del sistema 4.2BSD, aunque no se implementó en esa versión ni en 4.3BSD. [1] Sin embargo, Sun Microsystems había implementado esta misma API en su sistema operativo SunOS . Los desarrolladores de BSD de la Universidad de California en Berkeley solicitaron sin éxito a Sun que donara su implementación; En cambio, 4.3BSD-Reno se envió con una implementación basada en el sistema de memoria virtual de Mach . [2]

Respaldado por archivos y anónimo

El mapeo respaldado por archivos asigna un área de la memoria virtual del proceso a archivos; es decir, leer esas áreas de memoria hace que se lea el archivo. Es el tipo de mapeo predeterminado.

El mapeo anónimo mapea un área de la memoria virtual del proceso que no está respaldada por ningún archivo. El contenido se inicializa a cero. [3] En este sentido, un mapeo anónimo es similar a malloc y se usa en algunas implementaciones de malloc para ciertas asignaciones, particularmente las grandes. Las asignaciones anónimas no forman parte del estándar POSIX, pero se implementan en casi todos los sistemas operativos mediante las banderas MAP_ANONYMOUSy MAP_ANON.

Visibilidad de la memoria

Si la asignación se comparte (la MAP_SHAREDbandera está configurada), se conserva cuando se bifurca un proceso (mediante una fork(2)llamada al sistema). Por lo tanto, las escrituras en un área asignada en un proceso son inmediatamente visibles en todos los procesos relacionados (principal, secundario o hermano). Si la asignación se comparte y está respaldada por un archivo (no MAP_ANONYMOUS), solo se garantiza que el medio del archivo subyacente se escribirá después de pasarlo a la msync(2)llamada del sistema. Por el contrario, si la asignación es privada (la MAP_PRIVATEbandera está configurada), otros procesos no verán los cambios ni se escribirán en el archivo.

Un proceso que lee o escribe en el archivo subyacente no siempre verá los mismos datos que un proceso diferente que haya mapeado el archivo, ya que los segmentos del archivo se copian en la RAM y solo se descargan periódicamente en el disco. La sincronización se puede forzar con una llamada a msync(2).

El uso de mmap en archivos puede reducir significativamente la sobrecarga de memoria para las aplicaciones que acceden al mismo archivo; pueden compartir el área de memoria que abarca el archivo, en lugar de cargar el archivo para cada aplicación que quiera acceder a él. Esto significa que mmap(2) a veces se utiliza para la comunicación entre procesos (IPC). En los sistemas operativos modernos , normalmente se prefiere mmap(2) a la función de memoria compartida System V IPC . [4]

La principal diferencia entre la memoria compartida de System V (shmem) y las E/S asignadas en memoria (mmap) es que la memoria compartida de System V es persistente: a menos que un proceso la elimine explícitamente, se mantiene en la memoria y permanece disponible hasta que se apaga el sistema. . La memoria mmap no es persistente entre ejecuciones de aplicaciones (a menos que esté respaldada por un archivo).

Ejemplo de uso bajo el lenguaje de programación C

#incluir <sys/types.h> #incluir <sys/mman.h> #incluir <err.h> #incluir <fcntl.h> #incluir <stdio.h> #incluir <stdlib.h> #incluir <cadena.h> #incluir <unistd.h> /* Este ejemplo muestra cómo un mmap de /dev/zero es equivalente a utilizando memoria anónima (MAP_ANON) no conectada a ningún archivo. NB MAP_ANONYMOUS o MAP_ANON son compatibles con la mayoría de UNIX versiones, eliminando el propósito original de /dev/zero.*//* No funciona en OS X o macOS, donde no se puede realizar mmap sobre /dev/zero */int principal ( vacío ) { const char str1 [] = "cadena 1" ;     const char str2 [] = "cadena 2" ;     pid_t parpid = getpid (), childpid ;     intfd = -1 ;    char * anónimo , * cero ;   si (( fd = abrir ( "/dev/zero" , O_RDWR , 0 )) == -1 )        errar ( 1 , "abrir" );  anon = ( char * ) mmap ( NULL , 4096 , PROT_READ | PROT_WRITE , MAP_ANON | MAP_SHARED , -1 , 0 );        cero = ( char * ) mmap ( NULL , 4096 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );        si ( anon == MAP_FAILED || cero == MAP_FAILED )        errx ( 1 , "cualquiera mmap" );  strcpy ( anón , str1 );  strcpy ( cero , str1 );  printf ( "PID %d: \t %s anónimo, %s \n con respaldo cero " , parpid , anon , zero );    cambiar (( childpid = bifurcación ())) {     caso 1 :  err ( 1 , "bifurcación" );  /* NO ALCANZADO */ caso 0 :  childpid = getpid ();   printf ( "PID %d: \t %s anónimo, %s \n con respaldo cero " , childpid , anon , cero );    dormir ( 3 ); printf ( "PID %d: \t %s anónimo, %s \n con respaldo cero " , childpid , anon , cero );    munmap ( anón , 4096 );  munmap ( cero , 4096 );  cerrar ( fd ); devolver EXIT_SUCCESS ;  } dormir ( 2 ); strcpy ( anón , str2 );  strcpy ( cero , str2 );  printf ( "PID %d: \t %s anónimo, %s \n con respaldo cero " , parpid , anon , zero );    munmap ( anón , 4096 );  munmap ( cero , 4096 );  cerrar ( fd ); devolver EXIT_SUCCESS ; }

salida de muestra:

PID 22475: cadena anónima 1, cadena 1 con respaldo ceroPID 22476: cadena anónima 1, cadena 1 con respaldo ceroPID 22475: cadena anónima 2, cadena 2 con respaldo ceroPID 22476: cadena anónima 2, cadena 2 con respaldo cero

Uso en implementaciones de bases de datos

La llamada al sistema mmap se ha utilizado en varias implementaciones de bases de datos como una alternativa para implementar un grupo de búfer, aunque esto creó un conjunto diferente de problemas que, en realidad, solo podrían solucionarse utilizando un grupo de búfer. [5]

Ver también

Referencias

  1. ^ William alegría ; Eric Cooper; Robert Fabry ; Samuel Leffler ; Kirk McKusick ; David Mosher (1983). 4.2 Manual del sistema BSD (PDF) (Reporte). Grupo de Investigación de Sistemas Informáticos , Universidad de California, Berkeley .
  2. ^ McKusick, Marshall Kirk (1999). "Veinte años de Berkeley Unix: de propiedad de AT&T a libremente redistribuible". Fuentes abiertas: voces de la revolución del código abierto . O'Reilly.
  3. ^ "mmap(2) - página del manual de Linux".
  4. ^ Kerrisk, Michael (2010). La interfaz de programación de Linux: un manual de programación de sistemas Linux y UNIX . San Francisco: No Starch Press. pag. 1116.ISBN 978-1-59327-291-3. OCLC  728672600.
  5. ^ "¿Está seguro de que desea utilizar MMAP en su sistema de gestión de bases de datos?". db.cs.cmu.edu . Consultado el 4 de julio de 2023 .

Otras lecturas