stringtranslate.com

Archivo mapeado en memoria

Un archivo mapeado en memoria es un segmento de memoria virtual [1] al que se le ha asignado una correlación directa byte por byte con alguna porción de un archivo o recurso similar a un archivo. Este recurso suele ser un archivo que está físicamente presente en el disco, pero también puede ser un dispositivo, un objeto de memoria compartida u otro recurso al que un sistema operativo puede hacer referencia a través de un descriptor de archivo . Una vez presente, esta correlación entre el archivo y el espacio de memoria permite que las aplicaciones traten la parte asignada como si fuera memoria primaria.

Historia

TOPS-20 PMAP

Una de las primeras implementaciones ( c.  1969 ) [2] de esto fue la llamada al sistema PMAP en el sistema operativo TOPS-20 del DEC-20 , [3] una característica utilizada por el sistema de base de datos System-1022 de Software House . [4]

Mapa SunOS 4 mm

SunOS 4 [5] introdujo Unix , que permitía a los mmapprogramas "mapear archivos en la memoria". [1]

Archivos asignados en memoria ampliable de Windows (GMMF)

Dos décadas después del lanzamiento del PMAP de TOPS-20, Windows NT recibió archivos asignados en memoria cultivables (GMMF).

Dado que " CreateFileMappingla función requiere que se le pase un tamaño" y no es fácil modificar el tamaño de un archivo, se desarrolló una API GMMF. [6] [7] El uso de GMMF requiere declarar el máximo al que puede crecer el tamaño del archivo, pero no se desperdicia espacio no utilizado.

Beneficios

El beneficio de asignar memoria a un archivo es aumentar el rendimiento de E/S, especialmente cuando se usa en archivos grandes. Para archivos pequeños, los archivos mapeados en memoria pueden resultar en una pérdida de espacio [8] ya que los mapas de memoria siempre están alineados con el tamaño de la página, que en su mayoría es de 4 KiB. Por lo tanto, un archivo de 5 KiB asignará 8 KiB y, por lo tanto, se desperdiciarán 3 KiB. Acceder a archivos asignados en memoria es más rápido que utilizar operaciones directas de lectura y escritura por dos razones. En primer lugar, una llamada al sistema es mucho más lenta que un simple cambio en la memoria local de un programa. En segundo lugar, en la mayoría de los sistemas operativos la región de memoria asignada en realidad es la caché de páginas del núcleo (caché de archivos), lo que significa que no es necesario crear copias en el espacio del usuario.

Ciertas operaciones de archivos asignados en memoria a nivel de aplicación también funcionan mejor que sus contrapartes de archivos físicos. Las aplicaciones pueden acceder y actualizar los datos del archivo directamente y en el lugar, en lugar de buscar desde el inicio del archivo o reescribir todo el contenido editado en una ubicación temporal. Dado que el archivo mapeado en memoria se maneja internamente en páginas, el acceso lineal a archivos (como se ve, por ejemplo, en el almacenamiento de datos de archivos planos o archivos de configuración) requiere acceso al disco solo cuando se cruza un nuevo límite de página y puede escribir secciones más grandes del archivo. archivo al disco en una sola operación.

Un posible beneficio de los archivos mapeados en memoria es una "carga diferida", por lo que se utilizan pequeñas cantidades de RAM incluso para un archivo muy grande. Intentar cargar todo el contenido de un archivo que es significativamente mayor que la cantidad de memoria disponible puede causar una paliza severa cuando el sistema operativo lee del disco a la memoria y simultáneamente escribe páginas de la memoria al disco. El mapeo de memoria no solo puede omitir el archivo de página por completo, sino que también permite que se carguen secciones de tamaño de página más pequeñas a medida que se editan los datos, de manera similar a la paginación solicitada utilizada para los programas.

El proceso de mapeo de memoria lo maneja el administrador de memoria virtual , que es el mismo subsistema responsable de manejar el archivo de página . Los archivos asignados en memoria se cargan en la memoria una página completa a la vez. El tamaño de la página lo selecciona el sistema operativo para obtener el máximo rendimiento. Dado que la gestión de archivos de páginas es uno de los elementos más críticos de un sistema de memoria virtual, cargar secciones de un archivo del tamaño de una página en la memoria física suele ser una función del sistema muy optimizada. [9]

Tipos

Hay dos tipos de archivos asignados en memoria:

persistido

Los archivos persistentes están asociados con un archivo fuente en un disco. Los datos se guardan en el archivo fuente en el disco una vez finalizado el último proceso. Estos archivos mapeados en memoria son adecuados para trabajar con archivos fuente extremadamente grandes. [10]

No persistente

Los archivos no persistentes no están asociados con un archivo en un disco. Cuando el último proceso ha terminado de trabajar con el archivo, los datos se pierden. Estos archivos son adecuados para crear memoria compartida para comunicaciones entre procesos (IPC). [10]

Desventajas

La razón principal para elegir la E/S de archivos mapeados en memoria es el rendimiento. Sin embargo, puede haber compensaciones. El enfoque de E/S estándar es costoso debido a la sobrecarga de llamadas al sistema y la copia de memoria. El enfoque de mapeo de memoria tiene su costo en fallas menores de página , cuando un bloque de datos se carga en la caché de la página , pero aún no está mapeado en el espacio de memoria virtual del proceso. En algunas circunstancias, la E/S de archivos asignados en memoria puede ser sustancialmente más lenta que la E/S de archivos estándar. [11]

Otro inconveniente de los archivos mapeados en memoria se relaciona con el espacio de direcciones de una arquitectura determinada : un archivo más grande que el espacio direccionable sólo puede tener partes mapeadas a la vez, lo que complica su lectura. Por ejemplo, una arquitectura de 32 bits como la IA-32 de Intel solo puede abordar directamente porciones de archivos de 4 GiB o menos. Una cantidad aún menor de espacio direccionable está disponible para programas individuales, normalmente en el rango de 2 a 3 GiB, según el núcleo del sistema operativo. Sin embargo, este inconveniente prácticamente se elimina en la arquitectura moderna de 64 bits .

mmap también tiende a ser menos escalable que los medios estándar de E/S de archivos, ya que muchos sistemas operativos, incluido Linux, tienen un límite en la cantidad de núcleos que manejan fallas de página. Los dispositivos extremadamente rápidos, como los modernos SSD NVM Express , son capaces de hacer que los gastos generales sean una verdadera preocupación. [12]

Los errores de E/S en el archivo subyacente (por ejemplo, su unidad extraíble está desconectada o se expulsa el medio óptico, disco lleno al escribir, etc.) al acceder a su memoria asignada se informan a la aplicación como señales SIGSEGV/SIGBUS en POSIX, y el EXECUTE_IN_PAGE_ERROR excepción estructurada en Windows. Todo el código que accede a la memoria asignada debe estar preparado para manejar estos errores, que normalmente no ocurren al acceder a la memoria.

Sólo las arquitecturas de hardware con una MMU pueden admitir archivos asignados en memoria. En arquitecturas sin una MMU, el sistema operativo puede copiar el archivo completo en la memoria cuando se realiza la solicitud para mapearlo, pero esto es extremadamente derrochador y lento si solo se accede a una pequeña parte del archivo y solo puede funcionar para archivos. que cabe en la memoria disponible.

Usos comunes

Quizás el uso más común de un archivo asignado en memoria es el cargador de procesos en la mayoría de los sistemas operativos modernos (incluidos Microsoft Windows y sistemas similares a Unix ). Cuando se inicia un proceso , el sistema operativo utiliza un archivo asignado en memoria para traer el archivo ejecutable. , junto con cualquier módulo cargable, en la memoria para su ejecución. La mayoría de los sistemas de mapeo de memoria utilizan una técnica llamada paginación por demanda , donde el archivo se carga en la memoria física en subconjuntos (una página cada uno), y solo cuando realmente se hace referencia a esa página. [13] En el caso específico de archivos ejecutables, esto permite que el sistema operativo cargue selectivamente solo aquellas partes de una imagen de proceso que realmente necesitan ejecutarse.

Otro uso común de los archivos asignados en memoria es compartir memoria entre múltiples procesos. En los sistemas operativos modernos en modo protegido , los procesos generalmente no pueden acceder al espacio de memoria asignado para uso de otro proceso. (El intento de un programa de hacerlo provoca errores de página no válida o violaciones de segmentación ). Hay varias técnicas disponibles para compartir memoria de forma segura, y la E/S de archivos asignados en memoria es una de las más populares. Dos o más aplicaciones pueden asignar simultáneamente un único archivo físico a la memoria y acceder a esta memoria. Por ejemplo, el sistema operativo Microsoft Windows proporciona un mecanismo para que las aplicaciones mapeen en memoria un segmento compartido del archivo de página del sistema y compartan datos a través de esta sección.

Soporte de plataforma

La mayoría de los sistemas operativos o entornos de ejecución modernos admiten alguna forma de acceso a archivos asignados en memoria. La función mmap () , [14] que crea un mapeo de un archivo dado un descriptor de archivo, una ubicación inicial en el archivo y una longitud, es parte de la especificación POSIX , por lo que la amplia variedad de sistemas compatibles con POSIX, como UNIX , Linux , Mac OS X [15] u OpenVMS admiten un mecanismo común para archivos de mapeo de memoria. Los sistemas operativos Microsoft Windows también admiten un grupo de funciones API para este propósito, como CreateFileMapping() . [dieciséis]

Algunas implementaciones portátiles gratuitas de archivos asignados en memoria para Microsoft Windows y plataformas compatibles con POSIX son:

El lenguaje de programación Java proporciona clases y métodos para acceder a archivos asignados en memoria, como FileChannel.

El lenguaje de programación D admite archivos mapeados en memoria en su biblioteca estándar (módulo std.mmfile). [21]

Ruby tiene una gema (biblioteca) llamada Mmap, que implementa objetos de archivos mapeados en memoria.

Desde la versión 1.6, Python ha incluido un módulo mmap en su biblioteca estándar. [22] Los detalles del módulo varían según si la plataforma anfitriona es Windows o tipo Unix .

Para Perl hay varios módulos disponibles para archivos de mapeo de memoria en CPAN , como Sys::Mmap [23] y File::Map . [24]

En el tiempo de ejecución de Microsoft .NET, P/Invoke se puede utilizar para utilizar archivos asignados en memoria directamente a través de la API de Windows . El acceso administrado (P/Invoke no es necesario) a los archivos asignados en memoria se introdujo en la versión 4 del tiempo de ejecución (consulte Archivos asignados en memoria). Para versiones anteriores, existen bibliotecas de terceros que proporcionan API administradas. [25]

PHP admitía técnicas de mapeo de memoria en varias funciones nativas de acceso a archivos, como file_get_contents(), pero las eliminó en 5.3 (consulte el registro de revisión).

Para el lenguaje de programación R existe una biblioteca en CRAN llamada bigmemory que utiliza la biblioteca Boost y proporciona matrices respaldadas mapeadas en memoria directamente en R. El paquete ff ofrece vectores, matrices, matrices y marcos de datos mapeados en memoria.

El lenguaje de programación J admite archivos mapeados en memoria desde al menos 2005. Incluye soporte para datos de matriz en caja y archivos de tipo de datos único. El soporte se puede cargar desde 'data/jmf'. Los motores de bases de datos Jdb y JD de J utilizan archivos mapeados en memoria para los almacenes de columnas.

Julia (lenguaje de programación) admite E/S de archivos binarios asignados en memoria a través del Mmapmódulo dentro de la biblioteca estándar. [26]

Referencias

  1. ^ ab Chris Siebenmann (7 de junio de 2018). "La historia del confuso conjunto de formas de bajo nivel de Unix para asignar memoria".
  2. ^ El desarrollo comenzó en 1969, se envió en 1976.
  3. ^ "Manual de referencia de llamadas de monitor TOPS-20" (PDF) .
  4. ^ "Sistema de base de datos System 1022". Teníamos un caché PMAP para E/S de archivos (como PA1050) en secciones extendidas.
  5. ^ Diciembre de 1988
  6. ^ Jeffrey Richter (octubre de 1995). "Agregue archivos asignados en memoria cultivables a su aplicación". Revista de sistemas de Microsoft . págs. 17-28.
  7. ^ Creando un bloque de memoria compartida que puede crecer en tamaño
  8. ^ "Uso de mmap() para E/S avanzada de archivos - BrainDump". Archivado desde el original el 7 de agosto de 2011 . Consultado el 21 de mayo de 2011 .
  9. ^ "¿Qué tienen para ofrecer los archivos asignados en memoria?".
  10. ^ ab "Archivos asignados en memoria". Red de desarrolladores de Microsoft . Consultado el 4 de enero de 2016 .
  11. ^ http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, lectura versus mmap (o io versus fallas de página) por Matthew Dillon
  12. ^ Papagiannis, Anastasios; Xanthakis, Giorgos; Saloustros, Giorgos; Marazakis, Manolis; Bilas, Angelos (2020). Optimización de E/S asignadas en memoria para dispositivos de almacenamiento rápido. USENIX ATC '20. págs. 813–827.
  13. ^ "Paginación por demanda"
  14. ^ Archivos asignados en memoria Archivado el 9 de febrero de 2007 en Wayback Machine.
  15. ^ Apple - Mac OS X Leopard - Tecnología - UNIX Archivado el 23 de abril de 2009 en Wayback Machine.
  16. ^ Función CreateFileMapping (Windows)
  17. ^ "Compartir memoria entre procesos: archivos asignados en memoria". Boost.org.
  18. ^ "Archivos asignados en memoria". Boost.org.
  19. ^ "Archivos asignados en memoria para sistemas Windows y POSIX". FuenteForge.
  20. ^ "cpp-mmf". GitHub.
  21. ^ "archivo std.mm - lenguaje de programación D". Marte digital . Consultado el 4 de diciembre de 2011 .
  22. ^ "Nuevos módulos en 1.6". Archivado desde el original el 30 de diciembre de 2006 . Consultado el 23 de diciembre de 2008 .
  23. ^ "Sys::Módulo Mmap Perl".
  24. ^ "Archivo :: Módulo Map Perl".
  25. ^ DotNet Archivado el 19 de abril de 2010 en Wayback Machine.
  26. ^ "E/S asignadas en memoria · El lenguaje Julia". docs.julialang.org . Consultado el 3 de septiembre de 2023 .