Archivo proyectado en memoria
Un archivo proyectado en memoria (en inglés memory-mapped file, a veces traducido también como archivo mapeado en memoria o archivo de memoria mapeada) es, en informática, una porción de memoria virtual en la que se establece una correlación directa byte a byte con una parte de un archivo o un recurso similar. Este recurso es, normalmente, un archivo presente en el disco duro, o bien un objeto de memoria compartida u otro tipo de recurso al que el sistema operativo puede referirse por medio del descriptor de archivo. Una vez disponible esta correlación entre el archivo y el espacio de memoria, las aplicaciones pueden gestionar el acceso a ese recurso exactamente igual que si se tratara de memoria primaria.
Ventajas
La principal ventaja de un archivo proyectado en memoria es aumentar las prestaciones de lectura y escritura, especialmente cuando se utilizan archivos de un tamaño reducido.[cita requerida] Acceder a archivos de mapa de memoria es más rápido que usar operaciones de lectura / escritura por dos motivos. En primer lugar, una llamada del sistema es varios órdenes de magnitud más lenta que un simple cambio en la memoria local del programa; en segundo lugar, en la mayoría de sistemas operativos la región de memoria proyectada es, de hecho, la caché de página (caché de archivo), lo que implica que no se necesitan copias en el espacio de usuario.
Algunas operaciones de archivos proyectados en memoria dentro de las aplicaciones presentan también ventajas de rendimiento con respecto a sus variantes sobre archivos físicos. Las aplicaciones pueden acceder y actualizar los datos en el archivo directamente, en lugar de buscar desde el comienzo del archivo o reescribir el contenido modificado en un lugar transitorio. Dado que el archivo proyectado en memoria se maneja de forma interna en páginas, el acceso lineal de archivos (como por ejemplo en el caso de almacenamiento de datos en el modelo de tabla o archivos de configuración) requiere acceso de disco sólo cuando se cruza una nueva frontera, y puede escribir secciones mayores del archivo en el disco en una única operación.
Un posible beneficio de los archivos proyectados en memoria es la "carga vaga", utilizando por tanto pequeñas cantidades de RAM incluso para un archivo de tamaño grande. Tratar de cargar el contenido completo de un archivo que es significativamente más grande que la cantidad de memoria disponible puede provocar una hiperpaginación severa cuando el sistema operativo lee desde el disco en la memoria y, simultáneamente, escribe páginas de memoria al disco. La proyección en memoria permite no sólo evitar completamente el archivo de página, sino también que el sistema únicamente requiera cargar secciones de paginación de menor tamaño cuando se editan los datos, un concepto similar a la paginación por demanda utilizada en los programas.
El proceso de proyección en memoria lo ejecuta el administrador virtual de memoria, el mismo subsistema responsable de la paginación de memoria. Los archivos proyectados en memoria cargan en la memoria una paginación completa de una vez. El tamaño de la paginación es determinado por el sistema operativo para conseguir un rendimiento óptimo. Dado que la administración de archivos de páginas es uno de los elementos más críticos de un sistema de memoria virtual, cargar secciones del tamaño de una página en memoria física es normalmente una función de sistema altamente optimizada.[1]
Desventajas
La razón principal para utilizar archivos proyectados en memoria para la lectura y escritura es la mejora en rendimiento, aunque pueden darse situaciones de compromiso. El planteamiento convencional de lectura y escritura de datos es costoso debido a los excesos de llamadas a funciones del sistema y las operaciones de copia de memoria. La estrategia de proyección en memoria tiene su punto débil en la aparición de fallos de página menores, que pueden ocurrir cuando un bloque de datos se ha cargado en la caché de paginación, pero aún no está cargado en el espacio de memoria virtual del proceso. En determinadas circunstancias, la lectura y escritura de archivos proyectados en memoria puede ser considerablemente más lenta que la lectura y escritura convencional de archivos.[2]
Otra desventaja de los archivos proyectados en memoria está relacionada con el espacio de direcciones de ciertas arquitecturas: un archivo de tamaño mayor que el espacio direccionable solo puede proyectarse en memoria por trozos, lo cual complica su lectura. Un ejemplo de esto se da en una arquitectura de 32 bits como la IA-32 de Intel, que solo puede establecer direcciones en memoria para un máximo de 4 GiB del tamaño del archivo. Esta desventaja desaparece en aquellos dispositivos dotados de una unidad de gestión de memoria de lectura y escritura de datos (IOMMU, input/output memory management unit en inglés).
Usos típicos
Tal vez la aplicación más habitual de los archivos proyectados en memoria sea el cargador de procesos de la mayor parte de los sistemas operativos modernos, como Microsoft Windows y los sistemas de tipo Unix. Al iniciarse un proceso, el sistema operativo proyecta sobre la memoria el contenido del archivo ejecutable, junto con los demás módulos o bibliotecas dinámicas de los que dependa para su ejecución. La mayoría de los sistemas de proyección en memoria utilizan una técnica denominada paginación por demanda, mediante la cual el archivo se va cargando en la memoria física a trozos, de página en página, y solo cada vez que se requiere el acceso a una página concreta.[3] En el caso concreto de los archivos ejecutables, esto permite al sistema operativo cargar de manera selectiva solamente aquellas porciones de la imagen del proceso que se van a ejecutar.
Otro uso típico de los archivos proyectados en memoria consiste en hacer que procesos diferentes puedan compartir un área de memoria común. En los sistemas operativos modernos de modo protegido, cada proceso no puede acceder al espacio de memoria asignado a otros procesos. Hay varias estrategias disponibles para compartir memoria con seguridad y el uso de archivos proyectados en memoria es una de ellas. Para ello, dos procesos (que pueden ser dos programas diferentes o dos instancias de un mismo programa), acceden a un archivo conocido por ambos que cada uno de los procesos proyecta sobre su respectivo espacio de memoria, de modo que cada proceso puede ir leyendo en su espacio de memoria las modificaciones que haya llevado a cabo el otro proceso. Por ejemplo, el sistema operativo Microsoft Windows proporciona un mecanismo para que las aplicaciones proyecten en memoria un segmento compartido del archivo de paginación del sistema, con lo que varios programas pueden compartir datos accediendo a ese segmento.
Disponibilidad por plataforma
La mayor parte de los sistemas operativos y entornos de ejecución modernos proporcionan algún tipo de acceso a archivos proyectados en memoria. En la especificación POSIX, existe la función en lenguaje C mmap(),[4] que crea un mapa o proyección de archivo a partir de tres parámetros: un descriptor de archivo, una posición dentro del archivo y una longitud de los datos. Al tratarse de una función POSIX, está disponible en todos los sistemas compatibles POSIX, tales como UNIX, Linux, Mac OS X y OpenVMS. En la biblioteca de programación de Microsoft para Windows, el API Win32, existe también un conjunto de funciones en C para gestionar archivos proyectados en memoria, como CreateFileMapping().[5]
Las bibliotecas Boost en lenguaje C++ proporcionan clases fachada que encapsulan una implementación interna en términos de POSIX y API de Windows que permiten el uso del mismo código fuente para múltiples plataformas.[6]
El lenguaje Java proporciona también clases para gestionar archivos proyectados en memoria, como FileChannel.
En el lenguaje Ruby, la gema o biblioteca Mmap es la que permite gestionar este tipo de proyecciones en memoria.
El lenguaje Python incorpora desde la versión 1.6 un módulo mmap en su biblioteca estándar,[7] cuyas particularidades varían ligeramente entre Windows y los sistemas de tipo Unix.
Para Perl, existen varios módulos disponibles en la red CPAN que permiten utilizar archivos proyectados en memoria, tales como Sys::Mmap[8] y File::Map.[9]
La plataforma Microsoft .NET proporciona de manera nativa acceso gestionado a archivos proyectados en memoria a partir de la versión 4 de su Common Language Runtime. En versiones anteriores, existían bibliotecas externas para ello.[10]
PHP proporciona funcionalidad de archivos proyectados en memoria a través de varias funciones nativas de acceso a archivos como, por ejemplo, file_get_contents().[11]
Referencias
- http://msdn2.microsoft.com/en-us/library/ms810613.aspx, What Do Memory-Mapped Files Have to Offer?.
- http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, read vs. mmap (or io vs. page faults). Mensaje en la lista de correo de freebsd.org de Matthew Dillon (en inglés).
- http://www.linux-tutorial.info/modules.php?name=Tutorial&pageid=89, Demand Paging (en inglés).
- https://web.archive.org/web/20091007083754/http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html Memory Mapped Files (en inglés)
- http://msdn2.microsoft.com/en-us/library/aa366537.aspx CreateFileMapping Function (Windows) (en inglés)
- http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/classes/mapped_file.html
- «New Modules in 1.6». Archivado desde el original el 30 de diciembre de 2006. Consultado el 23 de diciembre de 2008.
- «Sys::Mmap Perl Module».
- «File::Map Perl Module».
- «Copia archivada». Archivado desde el original el 19 de abril de 2010. Consultado el 19 de octubre de 2009. DotNet
- http://www.php.net/manual/es/function.file-get-contents.php
Enlaces externos
- Esta obra contiene una traducción derivada de «Memory-mapped file» de Wikipedia en inglés, concretamente de esta versión, publicada por sus editores bajo la Licencia de documentación libre de GNU y la Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.
- Memory map I/O in Boost