stringtranslate.com

Archivo mapeado en memoria

Un archivo asignado a memoria es un segmento de memoria virtual [1] al que se le ha asignado una correlación directa byte a byte con alguna porción de un archivo o recurso similar a un archivo. Este recurso es típicamente 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 porción asignada como si fuera memoria principal.

Historia

TOPS-20 PMAP

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

Mapa mmap de SunOS 4

SunOS 4 [5] introdujo el lenguaje Unixmmap , que permitía a los programas "mapear archivos en la memoria". [1]

Archivos de memoria mapeables ampliables de Windows (GMMF)

Dos décadas después del lanzamiento del PMAP de TOPS-20, Windows NT recibió archivos mapeados en memoria ampliables (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 mapear un archivo en memoria 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 un desperdicio de espacio libre [8] ya que los mapas de memoria siempre están alineados con el tamaño de la página, que es en su mayoría de 4 KiB. Por lo tanto, un archivo de 5 KiB asignará 8 KiB y, por lo tanto, se desperdician 3 KiB. Acceder a archivos mapeados en memoria es más rápido que usar operaciones directas de lectura y escritura por dos razones. En primer lugar, una llamada al sistema es órdenes de magnitud 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 mapeada es en realidad 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.

Algunas operaciones de archivos mapeados en memoria a nivel de aplicación también funcionan mejor que sus contrapartes en archivos físicos. Las aplicaciones pueden acceder y actualizar datos en el archivo directamente y en el lugar, en lugar de buscar desde el principio 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 en el disco en una sola operación.

Una posible ventaja de los archivos mapeados en memoria es la "carga diferida", que permite utilizar pequeñas cantidades de RAM incluso para archivos muy grandes. Intentar cargar todo el contenido de un archivo que es significativamente más grande que la cantidad de memoria disponible puede provocar graves problemas , ya que el sistema operativo lee desde el disco a la memoria y, al mismo tiempo, escribe páginas desde la memoria al disco. El mapeo de memoria no solo puede pasar por alto el archivo de paginación por completo, sino que también permite cargar secciones de páginas más pequeñas a medida que se editan los datos, de manera similar a la paginación por demanda que se utiliza para los programas.

El proceso de mapeo de memoria es manejado por el administrador de memoria virtual , que es el mismo subsistema responsable de manejar el archivo de paginación . Los archivos mapeados en memoria se cargan en la memoria una página entera a la vez. El tamaño de página es seleccionado por el sistema operativo para un máximo rendimiento. Dado que la administración de archivos de paginación es uno de los elementos más críticos de un sistema de memoria virtual, cargar secciones del tamaño de una página de un archivo en la memoria física es típicamente una función del sistema altamente optimizada. [9]

Tipos

Hay dos tipos de archivos mapeados en memoria:

Persistió

Los archivos persistentes se asocian con un archivo de origen en un disco. Los datos se guardan en el archivo de origen en el disco una vez que finaliza el último proceso. Estos archivos asignados a la memoria son adecuados para trabajar con archivos de origen extremadamente grandes. [10]

No persistente

Los archivos no persistentes no están asociados a un archivo en un disco. Cuando el último proceso termina 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 principal razón para elegir la E/S de archivos mapeados en memoria es el rendimiento. Sin embargo, puede haber desventajas. El enfoque de E/S estándar es costoso debido a la sobrecarga de llamadas al sistema y la copia de memoria. El enfoque mapeado en memoria tiene su costo en fallas de página menores , cuando un bloque de datos se carga en la caché de páginas , pero aún no se mapea en el espacio de memoria virtual del proceso. En algunas circunstancias, la E/S de archivos mapeados 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 puede tener solo porciones mapeadas a la vez, lo que complica su lectura. Por ejemplo, una arquitectura de 32 bits como IA-32 de Intel solo puede direccionar directamente 4 GiB o porciones más pequeñas de archivos. Una cantidad aún menor de espacio direccionable está disponible para programas individuales, generalmente 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 la sobrecarga sea una verdadera preocupación. [12]

Los errores de E/S en el archivo subyacente (por ejemplo, si la unidad extraíble está desconectada o se expulsa el medio óptico, el disco está lleno al escribir, etc.) mientras se accede a su memoria asignada se informan a la aplicación como señales SIGSEGV/SIGBUS en POSIX y la excepción estructurada EXECUTE_IN_PAGE_ERROR 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.

Solo las arquitecturas de hardware con una MMU pueden admitir archivos mapeados 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 accederá a una pequeña parte del archivo, y solo puede funcionar para archivos que quepan en la memoria disponible.

Usos comunes

Quizás el uso más común de un archivo mapeado en memoria es el cargador de procesos en la mayoría de los sistemas operativos modernos (incluidos Windows y sistemas similares a Unix ). Cuando se inicia un proceso , el sistema operativo utiliza un archivo mapeado en memoria para llevar el archivo ejecutable, junto con cualquier módulo cargable, a 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 esa página es realmente referenciada. [13] En el caso específico de los 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 a la memoria es compartir memoria entre varios procesos. En los sistemas operativos modernos en modo protegido , generalmente no se permite a los procesos acceder al espacio de memoria que está asignado para que lo use 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 a la 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 asignen a la memoria un segmento compartido del propio 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 mapeados 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 el mapeo de archivos en memoria. Los sistemas operativos Microsoft Windows también admiten un grupo de funciones API para este propósito, como CreateFileMapping() [16] .

Algunas implementaciones portátiles gratuitas de archivos mapeados 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 mapeados 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 archivo 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 host es Windows o similar a 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 entorno de ejecución de Microsoft .NET, se puede utilizar P/Invoke para utilizar archivos asignados a memoria directamente a través de la API de Windows . El acceso administrado (P/Invoke no es necesario) a los archivos asignados a memoria se introdujo en la versión 4 del entorno de ejecución (consulte Archivos asignados a memoria). Para versiones anteriores, existen bibliotecas de terceros que proporcionan API administradas. [25] .NET tiene la MemoryMappedFileclase. [26] [27]

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 (ver registro de revisiones).

Para el lenguaje de programación R existe una biblioteca en CRAN llamada bigmemory que utiliza la biblioteca Boost y proporciona matrices respaldadas por mapas de memoria directamente en R. El paquete ff ofrece vectores, matrices, arreglos 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 un solo tipo de datos. El soporte se puede cargar desde 'data/jmf'. Los motores de base de datos Jdb y JD de J usan archivos mapeados en memoria para los almacenamientos de columnas.

El lenguaje de programación Julia tiene soporte para E/S de archivos binarios mapeados en memoria a través del Mmapmódulo dentro de la biblioteca estándar. [28]

Referencias

  1. ^ por Chris Siebenmann (7 de junio de 2018). "La historia del confuso conjunto de métodos de bajo nivel de Unix para asignar memoria".
  2. ^ El desarrollo comenzó en 1969 y se envió en 1976
  3. ^ "Manual de referencia de llamadas del monitor TOPS-20" (PDF) .
  4. ^ "Sistema de base de datos del sistema 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 ampliables en memoria a su aplicación". Microsoft Systems Journal . págs. 17–28.
  7. ^ Creación de un bloque de memoria compartida que puede crecer en tamaño
  8. ^ "Uso de mmap() para E/S de archivos avanzada - 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 mapeados en memoria?".
  10. ^ ab "Archivos asignados a la memoria". Microsoft Developer Network . Consultado el 4 de enero de 2016 .
  11. ^ http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, lectura vs. mmap (o io vs. errores 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. ^ "Buscapersonas a pedido"
  14. ^ Archivos mapeados 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 mapeados en memoria". Boost.org.
  18. ^ "Archivos mapeados en memoria". Boost.org.
  19. ^ "Archivos mapeados en memoria para sistemas Windows y POSIX". SourceForge.
  20. ^ "cpp-mmf". GitHub.
  21. ^ "std.mmfile - Lenguaje de programación D". Digital Mars . 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. ^ "Módulo Perl Sys::Mmap".
  24. ^ "Archivo::Mapa Módulo Perl".
  25. ^ DotNet Archivado el 19 de abril de 2010 en Wayback Machine.
  26. ^ "Clase MemoryMappedFile (System.IO.MemoryMappedFiles)". learn.microsoft.com . Consultado el 20 de octubre de 2024 .
  27. ^ "Archivos asignados a memoria - .NET". learn.microsoft.com . 14 de diciembre de 2022 . Consultado el 20 de octubre de 2024 .
  28. ^ "E/S mapeada en memoria · El lenguaje Julia". docs.julialang.org . Consultado el 3 de septiembre de 2023 .