Pregunta

Cuando hacemos un mapa de un archivo en la memoria, se requiere una llamada al sistema. Hacer los accesos posteriores al archivo de llamadas del sistema requiere o es la página de memoria virtual del proceso asignada a la caché de página real en la memoria?

actualización : Lo que también quiero saber es que si varios procesos acceden al mismo archivo a través de mmap. que tendrán acceso a la misma porción de memoria física de escritura.

¿Fue útil?

Solución

No hay necesidad de llamadas de sistema adicionales (por el proceso) , que acaba de acceder a ella como la memoria normal. Cuando haya terminado con el archivo, simplemente llame munmap.

  

Valor de retorno

     

En caso de éxito, mmap()   devuelve un puntero a la zona asignada.   En caso de error, el valor MAP_FAILED (que   es decir, (void *) -1) se devuelve, y   errno un valor apropiado. En   éxito, munmap() devuelve 0, en   fracaso -1, y errno se establece (probablemente   a EINVAL).

Consulte la página del manual aquí para más detalles .

Editar Para aclaración:

Estoy diciendo que la función mapea el archivo en el espacio de memoria del proceso de llamada y devuelve un puntero al comienzo del bloque de memoria.

Por ejemplo, si tiene dos procesos diferentes mapas del mismo archivo con la bandera MAP_SHARED entonces cada proceso va a acceder a la misma memoria física, pero que la memoria puede ser asignada a una ubicación diferente en el espacio de memoria virtual de cada proceso, es decir, el punteros devueltos por mmap en espacio de memoria virtual de cada proceso pueden no ser iguales.

Esto nos lleva a tal punto que si, por ejemplo, necesita almacenar punteros dentro del segmento de memoria compartida los punteros sólo sería útil si estuvieran almacenados como compensaciones en relación con el principio del bloque / archivo y que sólo sería capaz de útilmente apuntar a lugares internos al bloque / archivo.

Otros consejos

Cuando mmap un archivo, Linux crea entradas en el (unidad de gestión de memoria) MMU. La MMU guarda a todos los de lectura y escritura de la CPU a la memoria RAM real. De esta manera, se sabe cuando tiene acceso a partes de la memoria que mmap() regresó. La lectura de las piezas que no están todavía en la memoria RAM verdadera hará que los errores de página. La MMU atraparlos y llamar a una rutina del kernel a cargar la parte derecha del archivo en la memoria RAM en algún lugar y luego se actualizará la entrada en la tabla MMU lo que parece que los datos se encuentra ubicado en la dirección de la que mmap() le dio. De hecho, será en otro lugar pero la MMU hará que este completamente transparente.

Cuando se escribe a la memoria, la MMU marcará las páginas modificadas como "sucio". Cuando se vacían (porque se accede a más del fichero o porque se llama a munmap()), entonces los cambios se escriben en el disco.

Así que cada vez que un error de página y una página ras sucia ocurre, ocurre una llamada al sistema. Pero ya que las páginas son de 4 o de 8 KB, esto sucede raramente. Además, el núcleo se cargará más de una sola página a la vez, por lo que el número de llamadas al sistema se reduce de nuevo. Por último, el mismo código se utiliza para implementar el intercambio, por lo que es muy optimizado.

Todos estos efectos hacen mmap tan eficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top