c linux mmap dma

¿Por qué mmap() es más rápido que el IO secuencial?



linux dma (3)

Posible duplicado:
mmap () vs. bloques de lectura

Escuché (lo leí en algún lugar de Internet) que mmap() es más rápido que el IO secuencial. ¿Es esto correcto? Si es así, ¿por qué es más rápido?

  • mmap() no está leyendo secuencialmente.
  • mmap() tiene que buscarse desde el mismo disco como lo hace read()
  • El área asignada no es secuencial, por lo que no hay DMA (?).

¿Entonces mmap() debería ser más lento que read() desde un archivo? ¿Cuáles de mis suposiciones anteriores son incorrectas?


Escuché (lo leí en algún lugar de Internet) que mmap () es más rápido que el IO secuencial. ¿Es esto correcto? Si es así, ¿por qué es más rápido?

Puede ser - hay pros y contras, que se enumeran a continuación. Cuando realmente tenga razones para preocuparse, siempre haga una referencia de ambos .

Aparte de la eficiencia real de IO, hay implicaciones en la forma en que el código de la aplicación realiza un seguimiento cuando necesita realizar la E / S y el procesamiento / generación de datos, que a veces puede impactar el rendimiento de manera drástica.

1) mmap () no está leyendo secuencialmente. 2) mmap () tiene que buscarse desde el mismo disco que read () 3) El área asignada no es secuencial, por lo que no hay DMA (?).

¿Entonces mmap () debería ser más lento que leer () desde un archivo? ¿Cuáles de mis suposiciones anteriores son incorrectas?

1) es incorrecto ... mmap() asigna una región de espacio de direcciones virtuales correspondiente al contenido del archivo ... siempre que se accede a una página en ese espacio de direcciones, se encuentra que la RAM física respalda las direcciones virtuales y se falla el contenido del disco correspondiente en esa memoria RAM. Por lo tanto, el orden en que las lecturas se realizan desde el disco coincide con el orden de acceso. Es un mecanismo de E / S "perezoso". Si, por ejemplo, necesitaba indexar en una enorme tabla hash que debía leerse desde el disco, entonces el mmap y el acceso al acceso significa que la E / S del disco no se realiza de forma secuencial y, por lo tanto, puede resultar en un mayor tiempo transcurrido. hasta que todo el archivo se lea en la memoria, pero mientras eso sucede, las búsquedas son exitosas y se puede realizar un trabajo dependiente, y si las partes del archivo nunca son realmente necesarias, no se leen (permita la granularidad de las páginas de disco y memoria, y que incluso cuando se utiliza la asignación de memoria, muchos sistemas operativos le permiten especificar algunos consejos para mejorar el rendimiento / eficiencia de la memoria sobre sus patrones de acceso planificados, de modo que puedan leer anticipadamente o liberar memoria de forma más agresiva, sabiendo que es poco probable que vuelva a utilizarlos.

2) absolutamente cierto

3) "El área mapeada no es secuencial" es vago. Las regiones mapeadas en memoria son "contiguas" (secuenciales) en el espacio de direcciones virtuales. Hemos discutido que la E / S del disco es secuencial anteriormente. O, ¿estás pensando en algo más? De todos modos, mientras que las páginas tienen fallas, pueden ser transferidas usando DMA.

Además, hay otras razones por las que la asignación de memoria puede superar a la E / S habitual:

  • hay menos copia
    • a menudo las rutinas a nivel de sistema operativo y biblioteca pasan los datos a través de uno o más búferes antes de que alcancen un búfer especificado por la aplicación, la aplicación luego asigna el almacenamiento de forma dinámica, luego copia del búfer de E / S a ese almacenamiento, de modo que los datos se pueden usar después de que se completa la lectura del archivo
    • la asignación de memoria permite (pero no obliga) el uso en el lugar (solo puede grabar un puntero y posiblemente la longitud)
      • continuar accediendo a los datos en el lugar aumenta el riesgo de intercambio posterior: el archivo / mapa de memoria puede ser más detallado que las estructuras de datos en las que se puede analizar, por lo que los patrones de acceso a los datos podrían tener más retrasos en fallas en más páginas de memoria
  • la asignación de memoria puede simplificar el trabajo de análisis de la aplicación al permitir que la aplicación trate todo el contenido del archivo como accesible, en lugar de preocuparse por cuándo leer otro búfer lleno
  • La aplicación difiere más a la sabiduría del sistema operativo en cuanto al número de páginas que se encuentran en la RAM física en un momento dado, compartiendo de manera efectiva un caché de disco de acceso directo con la aplicación.
  • como bien indica el comentario a continuación, "al usar la asignación de memoria, normalmente se usan menos llamadas al sistema"
  • Si hay varios procesos que acceden al mismo archivo, deberían poder compartir las páginas de respaldo físico.

También hay razones por las que mmap puede ser más lento. Lee el post de Linus Torvald que dice sobre mmap :

... los juegos de mesa de página junto con la sobrecarga de fallas (e incluso la pérdida de TLB) es fácilmente mayor que el costo de copiar una página de una manera agradable de transmisión ...

Y de otro de sus posts :

  • Costes de instalación y desmontaje bastante notables. Y me refiero notable . Es como seguir las tablas de la página para desasignar todo de forma limpia. Es la contabilidad para mantener una lista de todas las asignaciones. Es la descarga TLB necesaria después de desasignar cosas.

  • la falta de página es costosa. Así es como se rellena el mapeo, y es bastante lento.

FWIW, la última vez que surgió esto para mí en el trabajo, la entrada de memoria asignada fue 80% más rápida que fread et al para leer registros de bases de datos binarias en una base de datos propietaria, en Linux de 64 bits con ~ 170 GB de archivos.


  1. mmap() puede compartir entre procesos.
  2. DMA se utilizará siempre que sea posible. DMA no requiere memoria contigua; muchas tarjetas de gama alta admiten DMA de dispersión y recolección.
  3. El área de memoria puede compartirse con el caché de bloques del kernel si es posible. Así que hay copia del arrendador.
  4. La memoria para mmap es asignada por el kernel, siempre está alineada.

"Más rápido" en términos absolutos no existe. Tendrías que especificar restricciones y circunstancias.

mmap () no está leyendo secuencialmente.

¿qué te hace pensar que? Si realmente accede secuencialmente a la memoria asignada, el sistema generalmente recuperará las páginas en ese orden.

mmap () tiene que buscarse desde el mismo disco como lo hace read ()

seguro, pero el sistema operativo determina el tiempo y el tamaño del búfer

El área asignada no es secuencial, por lo que no hay DMA (?).

véase más arriba

Con lo que mmap ayuda es que no hay espacio adicional de espacio de usuario involucrado, la "lectura" tiene lugar allí donde el kernel del sistema operativo se ajusta y en partes que pueden optimizarse. Esto puede ser una ventaja en la velocidad, pero en primer lugar es solo una interfaz que es más fácil de usar.

Si desea conocer la velocidad de una configuración particular (hardware, sistema operativo, patrón de uso), tendrá que medir.