Entendiendo MMAP

10

Estaba revisando la documentación sobre MMAP aquí e intenté implementarlo usando esto

Tengo algunas dudas con respecto a su implementación.

  1. ¿MMAP proporciona una asignación de un archivo y devuelve un puntero de esa ubicación en la memoria física o regresa con una dirección de la tabla de asignación? ¿y también asigna y bloquea espacio para ese archivo?

  2. Una vez que el archivo se almacena en esa ubicación en la memoria, ¿permanece allí hasta que se llama a munmap?

  3. ¿El archivo incluso se movió a la memoria o es solo una tabla de mapeo que sirve como una redirección y el archivo está realmente en la memoria virtual - (disco)?

  4. Suponiendo que se mueva a la memoria, ¿pueden otros procesos acceder a ese espacio para leer datos si tienen una dirección?

Juan
fuente
2
No implementar mmap , pero que está utilizando es
Basile Starynkevitch

Respuestas:

13

Contestando cosas en orden:

  1. Devuelve un puntero a la ubicación en la memoria virtual , y se asigna el espacio de dirección de la memoria virtual, pero el archivo no está bloqueado de ninguna manera a menos que lo bloquee explícitamente (también tenga en cuenta que bloquear la memoria no es lo mismo que bloquear la región en el archivo). Una implementación eficiente de mmap () en realidad solo es posible desde una perspectiva práctica debido a la paginación y la memoria virtual (de lo contrario, requeriría leer toda la región en la memoria antes de que se complete la llamada).
  2. No exactamente, esto se relaciona con la siguiente respuesta, así que lo cubriré allí.
  3. Mas o menos. Lo que realmente sucede en la mayoría de los casos es que mmap () proporciona acceso de copia en escritura a los datos de ese archivo en la caché de la página. Como resultado, se aplican las restricciones habituales de caché en la vida útil de los datos (si el sistema necesita espacio, las páginas se pueden soltar (o enjuagar en el disco si están sucias) de la caché y deben volver a introducirse).
  4. No, por cómo funciona la memoria virtual. Cada proceso tiene su propio espacio de dirección virtual, con sus propias asignaciones virtuales. Cada programa que quiera comunicar datos tendrá que llamar a mmap () en el mismo archivo (o segmento de memoria compartida), y todos deberán usar la MAP_SHAREDbandera.

Vale la pena señalar que mmap () no solo funciona en archivos, también puede hacer otras cosas con él, como:

  • Asignación directa de memoria del dispositivo (si tiene suficientes privilegios). En realidad, esto se usa en muchos sistemas integrados para evitar la necesidad de escribir controladores en modo kernel para hardware nuevo.
  • Mapa de segmentos de memoria compartida.
  • Asigna explícitamente páginas enormes.
  • Asigne memoria a la que luego puede llamar madvise (2) (que a su vez le permite hacer cosas útiles como evitar que los datos se copien en un proceso secundario en fork (2) o marcar datos para KSM (función de deduplicación de memoria de Linux)).
Austin Hemmelgarn
fuente
Gracias por una respuesta tan detallada. Solo una aclaración sobre el punto 1. Si intento acceder a la dirección de memoria virtual devuelta. Primero pasará por el mapa de direcciones creado para el proceso y luego será redirigido a la ubicación real, que puede ser disco, caché o memoria. En segundo lugar, si el indicador MAP_SHARED está activado y la tabla para ambos procesos devuelve el mismo valor para la dirección física, entonces el archivo puede ser compartido?
juan
1. Sí, usará la tabla de mapeo de memoria virtual. 2. La dirección en cada proceso no importa, solo el hecho de que han mapeado la misma región del mismo archivo con MAP_SHARED.
Austin Hemmelgarn