Asignación de un archivo a la memoria

La asignación de un archivo a la memoria (a la memoria)  es una forma de trabajar con archivos en algunos sistemas operativos, en la que al archivo completo o a una parte continua del mismo se le asigna un área determinada de la memoria (un rango de direcciones de RAM) . En este caso, la lectura de datos de estas direcciones en realidad conduce a la lectura de datos del archivo asignado, y la escritura de datos en estas direcciones conduce a la escritura de estos datos en el archivo. A menudo, puede asignar a la memoria no solo archivos ordinarios, sino también archivos de dispositivos.

Ventajas del método

Una alternativa al mapeo es leer directamente el archivo o escribir en el archivo. Esta forma de trabajar es menos conveniente por las siguientes razones:

  1. Es necesario recordar constantemente la posición actual del archivo y moverlo en el tiempo a la posición desde donde se realizará la lectura o donde irá la grabación.
  2. Cada llamada para cambiar/leer la posición actual, escribir/leer es una llamada al sistema que conduce a una pérdida de tiempo.
  3. Para trabajar a través de la lectura/escritura, aún debe asignar búferes de cierto tamaño, por lo que, en general, el trabajo consta de tres etapas: leer en el búfer -> modificar los datos en el búfer -> escribir en el archivo. A la hora de visualizar, el trabajo consta de una sola etapa: modificar datos en una determinada área de memoria.

Una ventaja adicional de usar una asignación es la menor carga en el sistema operativo en comparación con la lectura/escritura; el hecho es que cuando se usan asignaciones, el sistema operativo no carga todo el archivo en la memoria de una vez, sino que lo hace según sea necesario, en bloquea el tamaño de una página de memoria (generalmente 4 kilobytes). Por lo tanto, incluso con una pequeña cantidad de memoria física (por ejemplo, 32 megabytes), puede mostrar fácilmente un archivo de 100 megabytes o más sin causar mucha sobrecarga al sistema. Además, la ganancia se produce al escribir desde la memoria al disco: si ha actualizado una gran cantidad de datos en la memoria, pueden escribirse simultáneamente (en una sola pasada del cabezal sobre el disco) en el disco.

Un archivo mapeado en memoria también es conveniente porque puede cambiar fácilmente su tamaño y al mismo tiempo (después de reasignarlo) tener a su disposición una pieza continua de memoria del tamaño deseado. Con la memoria dinámica, tal truco no siempre es posible debido al fenómeno de la fragmentación. Cuando trabajamos con un archivo mapeado en memoria, el administrador de memoria configura automáticamente el procesador para que las páginas de RAM que almacenan fragmentos adyacentes del archivo formen un rango continuo de direcciones.

Desventajas

La razón principal para usar el mapeo es la ganancia de rendimiento. Sin embargo, debe ser consciente de los compromisos que tendrá que hacer. La E/S normal está plagada de la sobrecarga de llamadas al sistema adicionales y la copia innecesaria de datos, el uso de asignaciones está plagado de ralentizaciones debido a errores de acceso a la página. Digamos que la página relacionada con el archivo deseado ya está en el caché, pero no está asociada con esta pantalla. Si ha sido modificado por otro proceso, un intento de asociarlo con la asignación puede fallar y resultar en la necesidad de volver a leer los datos del disco o guardar los datos en el disco. Por lo tanto, aunque el programa realiza menos operaciones para acceder a través del mapa, en realidad, la operación de escribir datos en algún lugar del archivo puede llevar más tiempo que usar las operaciones de E/S del archivo (aunque en promedio el uso de mapas da una ganancia).

Otra desventaja es que el tamaño de la pantalla depende de la arquitectura utilizada. En teoría, las arquitecturas de 32 bits (Intel 386, ARM 9) no pueden crear asignaciones de más de 4 GB.

Aplicación

Quizás el uso más común de la asignación de archivo a memoria es cargar un proceso en la memoria (esto es cierto tanto para Microsoft Windows como para sistemas similares a Unix). Después de que se inicia un proceso, el sistema operativo asigna su archivo a la memoria que puede ejecutar (el atributo ejecutable). La mayoría de los sistemas que utilizan el mapeo de archivos utilizan la técnica de página bajo demanda , en la que el archivo se carga en la memoria no en su totalidad, sino en pequeñas partes, del tamaño de una página de memoria, mientras que la página se carga solo cuando realmente se necesita. [1] . En el caso de los archivos ejecutables, esta técnica permite que el sistema operativo mantenga en la memoria solo aquellas partes del código de máquina que realmente se necesitan para ejecutar el programa.

Otro caso de uso común para las asignaciones es crear fragmentos de memoria compartidos por múltiples procesos. En los sistemas operativos modernos (usando el modo protegido ), un proceso generalmente no permite que otros procesos accedan a "su" memoria. Los programas que intentan acceder a una memoria que no sea la suya arrojan fallas de página no válidas o excepciones de violación de segmentación .

El uso de archivos mapeados en memoria es una de las formas más populares y seguras (sin generar excepciones) de hacer que la memoria esté disponible para múltiples procesos. Dos o más aplicaciones pueden asignar simultáneamente el mismo archivo físico a su memoria y acceder a esa memoria.

Plataformas que soportan archivos mapeados en memoria

La mayoría de los sistemas operativos o shells modernos admiten alguna forma de manipulación de archivos mapeados en memoria. Por ejemplo, la función mmap () [2] , que crea un mapeo para un archivo con un descriptor dado, comenzando en alguna ubicación en el archivo y con cierta longitud, es parte de la especificación POSIX . Por lo tanto, una gran cantidad de sistemas compatibles con POSIX , como UNIX , Linux , FreeBSD , Mac OS X [3] u OpenVMS , admiten un mecanismo de asignación de archivos común. Microsoft Windows también admite una API específica para este fin, como CreateFileMapping() [4] .

Ejemplos

Pitón

importar mmap importar sistema operativo nombre de archivo = "/tmp/1.txt" Archivo = abrir ( nombre de archivo , "r+b" ) tamaño = os . camino _ getsize ( nombre de archivo ) data = mmap . mmap ( Archivo . fileno (), tamaño ) print data [ 0 : 5 ] # imprime los primeros 5 caracteres del archivo print data . read ( tamaño ) # imprime todo el contenido del archivo cadena = "¡¡¡Hola desde Python!!!" datos _ redimensionar ( tamaño + len ( cadena )) # aumentar el "tamaño mostrado" por el tamaño de la cadena que queremos que se ajuste a los datos . seek ( tamaño ) # Coloca el cursor al final de los datos del archivo . escriba ( cadena ) # y agregue la cadena al final del archivo de datos . cerrar () Archivo . cerrar () ## Cerrar el archivo

Enlaces

  1. Demanda de paginación  (enlace descendente)
  2. Archivos asignados a la memoria Archivado el 9 de febrero de 2007.
  3. Apple - Mac OS X Leopard - Tecnología - UNIX Archivado el 23 de abril de 2009.
  4. Función CreateFileMapping (Windows) . Consultado el 29 de abril de 2010. Archivado desde el original el 10 de octubre de 2008.