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.
¿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
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
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. –