2012-08-23 33 views
17

Por lo tanto, entiendo que si necesita memoria dinámicamente asignada, puede usar malloc(). Por ejemplo, su programa lee un archivo de longitud variable en un char []. No sabe de antemano qué tan grande es hacer su matriz, por lo que asigna la memoria en tiempo de ejecución.Cuándo usaría mmap

Estoy tratando de entender cuándo usaría mmap(). He leído la página del manual y, para ser sincero, no entiendo cuál es el caso de uso.

¿Alguien puede explicarme un caso de uso en términos simples? Gracias por adelantado.

Respuesta

28

mmap se puede utilizar para algunas cosas. Primero, una asignación respaldada por archivos. En lugar de asignar memoria con malloc y leer el archivo, mapea todo el archivo en la memoria sin leerlo explícitamente. Ahora cuando lee desde (o escribe en) esa área de memoria, las operaciones actúan en el archivo, de forma transparente. Por qué querrías hacer esto? Le permite procesar fácilmente archivos que son más grandes que la memoria disponible utilizando el mecanismo de búsqueda proporcionado por el sistema operativo. Incluso para archivos más pequeños, mmapping reduce la cantidad de copias de memoria.

mmap también se puede utilizar para un mapeo anónimo. Esta asignación no está respaldada por un archivo, y es básicamente una solicitud de un fragmento de memoria. Si eso suena similar a malloc, tienes razón. De hecho, la mayoría de las implementaciones de malloc usarán internamente un mmap anónimo para proporcionar un área de memoria grande.

Otro caso de uso común es tener múltiples procesos mapeando el mismo archivo como una asignación compartida para obtener una región de memoria compartida. El archivo no tiene que escribirse realmente en el disco. shm_open es una manera conveniente de hacer que esto suceda.

+0

¿Tiene un enlace con más detalles sobre cómo acceder a un archivo grande con solo una pequeña cantidad de memoria? Este punto me confunde sobre la forma en que funciona mmap() ... – Ioan

+0

@Ioan No hay realmente ningún detalle para archivos grandes: simplemente 'mmap' ellos. El archivo tiene que caber en la memoria _virtual_ por supuesto, pero no es necesario que toda la memoria virtual esté presente en la memoria RAM en ningún momento dado. 'mmap' utiliza el mismo mecanismo que el espacio de intercambio. Pero una explicación de cómo funciona la memoria virutal sería demasiado larga para un comentario :) –

+0

Tu comentario tiene más sentido. Entendí mal lo que quería decir con el procesamiento de archivos más grandes que la memoria disponible. – Ioan

5

Cuando necesite leer/escribir bloques de datos de un tamaño fijo es mucho más simple (y más rápido) simplemente asignar el archivo de datos en el disco a la memoria utilizando mmap y acceder directamente en lugar de asignar memoria, leer el archivo, acceda a los datos, escriba los datos nuevamente en el disco y libere la memoria.