Contestando cosas en orden:
- 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).
- No exactamente, esto se relaciona con la siguiente respuesta, así que lo cubriré allí.
- 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).
- 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_SHARED
bandera.
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)).
mmap
, pero que está utilizando es