pointer example allocate c linux memory-management malloc mmap

example - memory allocation malloc



¿Qué pasa si asigno memoria utilizando mmap en lugar de malloc? (3)

En primer lugar, mmap() es una construcción específica de la plataforma, por lo que si planea escribir C portátil, ya está fuera.

Segundo, malloc() se implementa esencialmente en términos de mmap() , pero es una especie de envoltorio de biblioteca inteligente alrededor de la llamada al sistema: solicitará nueva memoria del sistema cuando sea necesario, pero hasta entonces seleccionará una parte de la memoria en Un área que ya está comprometida con el proceso.

Por lo tanto, si desea realizar una asignación de memoria dinámica ordinaria, use malloc() , final de la historia. El uso de mmap() para la asignación de memoria se debe reservar para situaciones especiales (por ejemplo, si realmente desea una página completa para usted, alineada en el límite de la página), y siempre abstraída en una sola pieza de código de biblioteca para que otros puedan entender fácilmente lo que estás haciendo.

¿Cuáles son las desventajas de asignar memoria usando mmap (con MAP_PRIVATE y MAP_ANONYMOUS) que usando malloc ? Para los datos en el alcance de la función, usaría la memoria de pila de todos modos y por lo tanto no malloc.

Una desventaja que viene a la mente es la de las estructuras de datos dinámicos, como los árboles y las listas vinculadas, donde con frecuencia se requiere asignar y desasignar pequeños fragmentos de datos. El uso de mmap sería caro por dos razones, una para asignar una granularidad de 4096 bytes y la otra para requerir hacer una llamada al sistema.

Pero en otros escenarios, ¿crees que malloc es mejor que mmap ? En segundo lugar, ¿estoy sobreestimando la desventaja de mmap para las estructuras de datos dinámicos?

Una de las ventajas de mmap sobre malloc que se me ocurre es que la memoria se devuelve inmediatamente al sistema operativo, cuando se hace munmap , mientras que con malloc/free , creo que la memoria hasta el punto de interrupción del segmento de datos nunca se devuelve, pero se conserva para su reutilización.


Sí, malloc es mejor que mmap . Es mucho más fácil de usar, mucho más preciso y mucho más portátil. Al final, llamará mmap todos modos.

Si comienza a realizar la administración de memoria diaria con mmap , querrá implementar alguna forma de parcelarlo en partes más pequeñas que en las páginas y terminará reimplementando malloc , de una manera subóptima, probablemente.


Una característica que mmap tiene que malloc no tiene, es que mmap permite asignar el uso de Huge Pages (el argumento de la bandera tiene establecido MAP_HUGETLB ), mientras que malloc no tiene esa opción.