¿Cuándo debo usar mmap para acceder a archivos?

 C Programming >> Programación C >  >> Tags >> File
¿Cuándo debo usar mmap para acceder a archivos?

01 es excelente si tiene varios procesos que acceden a los datos en modo de solo lectura desde el mismo archivo, lo cual es común en el tipo de sistemas de servidor que escribo. 10 permite que todos esos procesos compartan las mismas páginas de memoria física, ahorrando mucha memoria.

28 también permite que el sistema operativo optimice las operaciones de paginación. Por ejemplo, considere dos programas; programa 32 que se lee en un 40 archivo en un búfer creando con 59 , y el programa B que 61 el archivo de 1 MB en la memoria. Si el sistema operativo tiene que intercambiar parte de 73 memoria, debe escribir el contenido del búfer para intercambiar antes de que pueda reutilizar la memoria. En 80 caso de cualquier 90 sin modificar Las páginas 'd se pueden reutilizar inmediatamente porque el sistema operativo sabe cómo restaurarlas desde el archivo existente en el que estaban 107 de. (El sistema operativo puede detectar qué páginas no se han modificado marcando inicialmente 115 como escribibles). 'd páginas como solo lectura y detección de fallas de segmentación, similar a la estrategia Copiar en escritura).

120 también es útil para la comunicación entre procesos. Puedes 134 un archivo como lectura/escritura en los procesos que necesitan comunicarse y luego usar primitivas de sincronización en el 147 región (esto es lo que 159 la bandera es para).

Un lugar 166 puede ser incómodo si necesita trabajar con archivos muy grandes en una máquina de 32 bits. Esto se debe a que 179 tiene que encontrar un bloque contiguo de direcciones en el espacio de direcciones de su proceso que sea lo suficientemente grande como para caber en todo el rango del archivo que se está mapeando. Esto puede convertirse en un problema si su espacio de direcciones se fragmenta, donde puede tener 2 GB de espacio de direcciones libres, pero ningún rango individual puede caber en una asignación de archivos de 1 GB. En este caso, es posible que deba mapear el archivo en partes más pequeñas de lo que le gustaría para que encaje.

Otra incomodidad potencial con 187 como reemplazo de lectura / escritura es que debe comenzar su mapeo en compensaciones del tamaño de página. Si solo desea obtener algunos datos en el desplazamiento 197 deberá corregir ese desplazamiento para que sea compatible con 202 .

Y finalmente, leer/escribir es la única forma en que puede trabajar con algunos tipos de archivos. 210 no se puede usar en cosas como tuberías y ttys.


Un área en la que encontré que mmap() no era una ventaja fue al leer archivos pequeños (menos de 16K). La sobrecarga de fallas de página para leer todo el archivo fue muy alta en comparación con solo hacer una sola llamada al sistema read(). Esto se debe a que el kernel a veces puede satisfacer una lectura por completo en su intervalo de tiempo, lo que significa que su código no cambia. Con una falla de página, parecía más probable que se programara otro programa, lo que hacía que la operación del archivo tuviera una latencia más alta.


220 tiene la ventaja cuando tiene acceso aleatorio a archivos grandes. Otra ventaja es que se accede a él con operaciones de memoria (memcpy, aritmética de punteros), sin preocuparse por el almacenamiento en búfer. La E/S normal a veces puede ser bastante difícil cuando se usan búferes cuando tiene estructuras más grandes que su búfer. El código para manejar que a menudo es difícil de hacer bien, mmap es generalmente más fácil. Dicho esto, hay ciertas trampas cuando se trabaja con 238 .Como la gente ya ha mencionado, 242 es bastante costoso de configurar, por lo que vale la pena usarlo solo para un tamaño determinado (que varía de una máquina a otra).

Para accesos secuenciales puros al archivo, tampoco es siempre la mejor solución, aunque una llamada apropiada a 251 puede mitigar el problema.

Debe tener cuidado con las restricciones de alineación de su arquitectura (SPARC, itanium), con E/S de lectura/escritura, los búferes a menudo están correctamente alineados y no se atrapan cuando se quita la referencia a un puntero emitido.

También hay que tener cuidado de no acceder fuera del mapa. Puede suceder fácilmente si usa funciones de cadena en su mapa y su archivo no contiene un \0 al final. Funcionará la mayor parte del tiempo cuando el tamaño de su archivo no sea un múltiplo del tamaño de la página, ya que la última página se llena con 0 (el área asignada siempre tiene el tamaño de un múltiplo del tamaño de su página).