GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es la diferencia entre escribir en un archivo y una memoria mapeada?

  1. Una razón puede ser que tiene un código (heredado) que está configurado para escribir en un búfer de datos, y luego este búfer se escribe en el archivo de una sola vez al final. En este caso usando mmap guardará al menos una copia de los datos, ya que el sistema operativo puede escribir directamente el búfer en el disco. Siempre que se trate solo de escritura de archivos, no puedo (todavía) imaginar ninguna otra razón por la que desee usar mmap .

  2. No, diría que la protección no es relevante aquí.

  3. Puede guardar una o dos copias de los datos de, p. del búfer de la aplicación al búfer de libc al búfer del sistema operativo, consulte el punto 1. Esto podría marcar una diferencia en el rendimiento al escribir grandes cantidades de datos.

  4. No. Hasta donde yo sé, el sistema operativo es libre de escribir los datos en cualquier momento que desee, siempre que los datos se hayan escrito en el disco después de una llamada a msync o munmap en esa región de memoria. (Y para la mayoría de los archivos, es probable que no escriba nada en el medio la mayor parte del tiempo, por razones de rendimiento:escribir un bloque completo en el disco porque un byte cambió es bastante costoso, en particular si es de esperar que se realizarán muchas más modificaciones en el bloque en un futuro próximo).


Un archivo mapeado en la memoria en realidad está mapeado parcial o totalmente en la memoria (RAM), mientras que un archivo en el que escribe se escribiría en la memoria y luego se descargaría en el disco. Un archivo asignado a la memoria se toma del disco y se coloca en la memoria explícitamente para lectura y/o escritura. Permanece allí hasta que lo desasignas.

El acceso al disco es más lento, por lo que cuando haya escrito en un archivo, se descargará en el disco y ya no residirá en la RAM, lo que significa que la próxima vez que necesite el archivo, es posible que lo obtenga del disco ( lento), mientras que en los archivos asignados a la memoria, usted sabe que el archivo está en la RAM y puede tener un acceso más rápido que cuando está en el disco.

Además, los archivos mapeados de memoria se utilizan a menudo como un mecanismo IPC, por lo que dos o más procesos pueden compartir fácilmente el mismo archivo y leer/escribir en él. (utilizando los mecanismos de sincronización necesarios)

Cuando necesita leer un archivo con frecuencia, y este archivo es bastante grande, puede ser ventajoso mapearlo en la memoria para que tenga un acceso más rápido que tener que abrirlo y obtenerlo del disco cada vez.

EDITAR:

Eso depende según sus necesidades, cuando tiene un archivo al que varios subprocesos necesitarán acceder con mucha frecuencia, entonces no estoy seguro de que el mapeo de memoria del archivo sea necesariamente una buena idea, desde el punto de vista de eso, tendrá que sincronizar acceda a este archivo mmap'ed si lo desea, escríbalo, en los mismos lugares desde diferentes hilos. Si eso sucede muy a menudo, podría ser un lugar para la disputa de recursos.

Solo leyendo el archivo, entonces esta podría ser una buena solución, porque realmente no necesita sincronizar el acceso, si es solo leyendo de él desde múltiples hilos. En el momento en que empiezas a escribir, tienes que utilizar mecanismos de sincronización.

Le sugiero que haga que cada subproceso haga su propio acceso al archivo de forma local, si tiene que escribir en el archivo, tal como lo hace con cualquier otro archivo. De esta forma, reduce la necesidad de sincronización de subprocesos y la probabilidad de errores difíciles de encontrar y depurar.


1) No entiende la llamada al sistema write(2). write() no escribe, simplemente copia el contenido de un búfer en la cadena de búfer del sistema operativo y lo marca como sucio. Uno de los subprocesos del sistema operativo (bdflush IIRC) recogerá estos búferes, los escribirá en el disco y jugará con algunas banderas. más tarde. Con mmap, accede directamente al búfer del sistema operativo (pero si altera su contenido, también se marcará como sucio)

2) No se trata de protección, se trata de establecer indicadores en las entradas de la tabla de páginas.

3) evita el doble almacenamiento en búfer. También puede direccionar el archivo en términos de caracteres en lugar de bloques, lo que a veces es más práctico

4) Son los búferes del sistema (conectados a su espacio de direcciones) que ha estado usando. El sistema puede o no haber escrito partes de él en el disco.

5) Si los subprocesos pertenecen al mismo proceso y comparten las tablas de páginas y el espacio de direcciones, sí.


Linux
  1. ¿Cuál es la diferencia entre InnoDB y MyISAM?

  2. ¿La diferencia entre .exrc y .vimrc?

  3. ¿Cuál es la diferencia entre fsync y syncfs?

  4. ¿Cuál es la diferencia entre ls y l?

  5. ¿Cuál es la diferencia entre PAE de 32 bits y núcleos de 64 bits?

¿Cuál es la diferencia entre Linux y Unix?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Cuál es la diferencia entre DMA y E/S mapeada en memoria?

¿Cuál es la diferencia entre $(CC) y $CC?

¿Cuál es la diferencia entre unlink y rm?