2009-11-15 22 views
31

Creé dos programas, uno usando malloc y otro usando mmap. El tiempo de ejecución con mmap es mucho menor que con malloc.malloc vs mmap en C

Sé por ejemplo que cuando usa mmap evita las llamadas de lectura/escritura al sistema. Y el acceso a la memoria es menor.

¿Pero hay alguna otra razón para las ventajas al usar mmap sobre malloc?

Muchas gracias

+0

¿Puedo suponer que su programa malloc usa leer/escribir o fread/fwrite para hacer algo de E/S en el archivo que mmap en el otro caso? – Suppressingfire

+0

Sí, en realidad estoy usando lectura/escritura con malloc, mmap y el uso de llamadas R/W normales. usando llamadas R/W es más rápido que usar malloc, creo que es porque acceder al disco es más rápido que la memoria. – Peter

+6

No es que acceder al disco sea más rápido que la memoria. Casi siempre, la memoria es mucho más rápida que el disco, y malloc no es lo que está costando tiempo. El código mmap es más rápido porque para su programa, mmap ha resultado en un menor acceso al disco o en un acceso al disco más eficiente que cualquiera que sea la lectura y escritura con la que comparó. Por ejemplo, 'escribir' todo el archivo realmente envía todos esos bytes al disco. mmap simplemente significa * if * usted modifica los datos editados 'mmap', * luego * el SO escribirá los cambios. Entonces, si termina sin modificar todo el archivo, es posible que solo escriba una fracción. –

Respuesta

11

Asumo que usted se refiere al uso de mmap y malloc para leer datos de archivos. En ese caso, tiene el punto principal:

  • usando fread/fwrite tiene que hacer muchas llamadas al sistema operativo.
  • utilizando mmap parece que tiene acceso al archivo completo en una sola operación. Esto no es del todo cierto porque el sistema operativo probablemente asigna el archivo a memory page a la vez, pero todavía es mucho más rápido.
+1

Para agregar a eso, 'fread' está almacenado en el búfer esto significa que si está precedido por un fseek siempre llenará su memoria intermedia por completo. Tenía un programa que leía un archivo secuencialmente pero precedía a 'fseek' antes de cada registro (de tamaño 32) leyendo 8192 bytes.Así que terminó leyendo 256 veces más datos de lo necesario, además de leer siempre dos llamadas al kernel. Con 'mmap' no tienes ninguno (visible). –

7

mmap en realidad no carga el archivo en la memoria, por lo que se cargará más rápido, pero la edición será más lenta.

Otro punto es que mmap no usa ninguna memoria, pero ocupa espacio de direcciones. En una máquina de 64 bits, la mayor parte del espacio de direcciones de memoria no tendrá memoria, por lo que podría cargar archivos enormes, digamos 5 gb, que no querría malloc.

0

mmap en realidad no lee el archivo. Simplemente lo asigna al espacio de direcciones. Es por eso que es tan rápido que no hay E/S de disco hasta que realmente accedes a esa región del espacio de direcciones.

malloc es simplemente una asignación de espacio de direcciones de memoria a

6

gente mira, al contrario creen común, mmap es de hecho una función de asignación de memoria similar a malloc ..

el archivo mmaped es un uso de ella .. que se puede utilizar como función de asignación de memoria que pasa -1 como descriptor de archivo ..

así .. el uso común es usar malloc para pequeños objetos y mmap para las grandes ..

este es un buen estrategia ..

yo uso alloca() para que alcance función sólo las variables ..

+5

Normalmente el asignador usará 'mmap' en sí mismo dependiendo del tamaño del área solicitada con' malloc'. En Solaris cuando solicite más de 128K obtendrá un bloque mapeado de memoria 'MAP_ANON'. En OS/X, el límite es de 64 KB si recuerdo correctamente, otros sistemas y bibliotecas de asignación tendrán otros valores. –

8

Tanto malloc y mmap son lento a veces. Depende principalmente del patrón de uso:

mmap: El subsistema de paginación del kernel funciona en unidades de tamaño de página. Esto significa que, si quiere leer una página entera de un archivo y quiere hacer eso repetidamente (buena localización), estará bien con mmap. Contrariamente, si mapeas ese archivo de 5 Gb y haces un acceso disperso, tendrás las páginas de intercambio del núcleo dentro y fuera mucho. Además de la E/S real, la gestión de la página llevará algún tiempo. Si le preocupa la latencia, evite este patrón de acceso, ya que el mecanismo de reclamación de la página de Linux tiende a ser explosivo y provocará rezagos notables, y la intoxicación de la caché ralentizará otros procesos.

malloc: Está bien cuando necesita memoria que no está en unidades de tamaño de página. pero no puedes hacer cosas como mlock() sanamente. En términos de E/S, la velocidad depende mucho de cómo lo haga. fread/fwrite puede asignar páginas detrás de las escenas, o hará un almacenamiento en búfer en el espacio de usuario. El acceso localizado será bastante rápido. la lectura/escritura va directamente a través del núcleo, por lo que los accesos distribuidos pequeños seguirán causando E/S debido a errores de caché, pero los datos reales transferidos desde kernel-> userspace serán un poco menos. No sé si eso se puede medir.

A menos que mlock() 'ed, las páginas del usuario se pueden intercambiar o revertir en cualquier momento. Esto también lleva tiempo. Por lo tanto, en sistemas con poca memoria, la variante que mapea la menor cantidad de memoria ganará. Con Linux kernel, cada sistema tiene muy poca memoria ya que las páginas no utilizadas se utilizan para almacenar en caché las E/S, y el kernel puede tomar un tiempo notable para que estén disponibles si el uso de la memoria o E/S tiene ráfagas.

-3

Por mmap RAM no se concede. Se concede espacio de direcciones.

Cuando se accede al espacio de direcciones, se produce un error de página. Durante el error de página en el tamaño de página, generalmente se proporciona 4096 bytes, RAM.

También se proporciona contenido de RAM. Si en un archivo se respalda el espacio de direcciones , aparecerá el contenido del archivo. Si en MAP_ANONYMOUS se respalda el espacio de direcciones , entonces aparece la RAM inicializada cero.

Por los dos nombramientos anteriores se describen. Primero, exactamente como se puede inicializar la RAM deseada. Segundo, hasta que no se proporcione la RAM.

Para una solicitud de dirección de menos de 2 megabytes por malloc se ha ampliado la interrupción del programa. Si bien las direcciones cercanas a la interrupción del programa se proporcionan , no se puede contratar la interrupción del programa. Por lo tanto, para el kernel liberado, es posible que la RAM no se devuelva. Sigue una analogía. ¿Se pueden quitar los calcetines antes de los zapatos?

Por la invocación de munmap al núcleo RAM se devuelve inmediatamente. Por mmap y munmap se mitiga el uso de la probabilidad de intercambio. Por la probabilidad de intercambio de expansión de programa malloc se incita.

Por malloc se puede asignar menos memoria de tamaño de página. se convierte en memoria discontinua. La memoria del kernel también se puede fragmentar. Ninguno de los dos es perfecto.

En cualquier procesador inactivo del kernel se puede evitar la RAM. Se crean páginas enormes transparentes de 2 megabytes. En comparación con 512 faltas de página para proporcionar 2M Cuando por una sola página se puede proporcionar un error de 2M , se obtiene una importante ventaja en el rendimiento.

Por mmap existe al menos una desventaja notable. Para un respaldo de mmap, se puede usar un descriptor de archivo de tubería. No se produce un error. Sin embargo, en la dirección de memoria , los datos provistos no aparecen.

Sin embargo, si se utiliza MAP_ANONYMOUS , a partir del descriptor de archivo de tubería en la dirección proporcionada por mmap se pueden leer los datos. Aunque no es tan eficiente, se obtiene el resultado deseado. Por un lseek error return y errno se puede identificar un descriptor de archivo adjunto a la tubería.

Por computadoras que pueden abordar un megabyte completo y ejecutar un sistema operativo basado en disco , entonces el uso de malloc es esencial. Si se utiliza la función de obtención de biblioteca proporcionada por la biblioteca C , entonces probablemente se utilizará malloc y libre.

En un sistema operativo controlado por kernel en lugar de mmap ¿por qué usar malloc? Comparado con malloc; mmap parece complicado? Para invocar munmap , también debe proporcionarse la cantidad de espacio de direcciones solicitada anteriormente . uso de malloc es más portátil? malloc parece más conveniente?

Sin embargo, si se desea el rendimiento, entonces se utiliza mmap.

Por último, pero no menos importante si se puede compartir MAP_SHARED con los datos de procesos de progenie. Evitar pthreads es primordial. A veces, el clon también se puede evitar.

Aunque subjetiva, métodos de asignación de variables enumeran en el de más a menos preferido sigue: registro/pila; mmap; global; malloc. Por cada diferentes bendiciones y benes convertido. Por un programa suficientemente complicado; se usan tres o posiblemente los cuatro métodos.

+2

Esta respuesta necesita una edición seria. –

+2

Nay afa, solo necesita que el pirata hable para que sea haciendo corrector en su cabeza. –