2010-07-28 13 views
12

Quiero implementar mi propio sistema de administración de memoria dinámica para agregar nuevas características que ayudan a administrar la memoria en C++.¿Cómo se implementa Malloc y Free?

Uso Windows (XP) y Linux (Ubuntu). ¿Qué se necesita para implementar funciones como 'malloc' y 'free'? Creo que tengo que usar las llamadas al sistema de nivel más bajo.

Para Windows, he encontrado las funciones: GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy y HeapFree.

Para Linux, no he encontrado ninguna llamada al sistema para la administración de heap. En Linux, malloc y free son llamadas al sistema, ¿no?

Gracias

Editar:
C++ no proporciona recolector de basura y el recolector de basura es lento. Algunas asignaciones son fáciles de liberar, pero hay asignaciones que necesitan un recolector de basura.

Quiero implementar estas funciones y agregar nuevas funciones:
* Siempre que se llame a free(), compruebe si el puntero pertenece al montón.
* Ayuda con la recolección de basura. Tengo que almacenar cierta información sobre el bloque asignado.
* Usar varios montones (HeapCreate/HeapDestroy en Windows). Puedo eliminar un montón completo con sus bloques asignados rápidamente.

+1

Debería consultar los asignados de pool de boost: http://www.boost.org/doc/libs/1_43_0/libs/pool/doc/index.html –

+2

¿Está seguro de que HeapAlloc es una llamada de sistema (kernel)? Esto bien puede implementarse desde el lado del usuario y desencadenar alguna función privada oculta del kernel cuando el proceso necesita más memoria. – doron

+0

Squall: esto suena extrañamente como una pregunta de tarea de la redacción. ¿sí? ¿no? –

Respuesta

14

En linux, malloc y free no son llamadas al sistema. malloc/free obtiene memoria del núcleo extendiendo y reduciendo (si puede) el segmento de datos usando el sistema brk llama al sistema y obtiene memoria anónima con mmap - y malloc administra la memoria dentro de esas regiones. Se puede encontrar información básica sobre muchas referencias importantes here

+0

En realidad, 'sbrk' no es una llamada al sistema, sino una función de biblioteca. – Borealid

3

brk es la llamada al sistema utilizada en Linux para implementar malloc y free. Pruebe la página man para obtener información.

Ya tienes las cosas de Windows.

Al ver las otras respuestas aquí, me gustaría señalar que probablemente esté reinventando la rueda; hay muchas implementaciones buenas malloc que ya existen. Pero la programación malloc es un buen ejercicio de reflexión: eche un vistazo a here para una buena asignación de tarea (originalmente código CMU) que implementa la misma. Sin embargo, su shell te da un poco más de lo que realmente hace el sistema operativo Linux :-).

4

Si simplemente está ajustando las llamadas al sistema, probablemente no obtenga nada con el uso del malloc estándar; eso es todo lo que están haciendo.

Es más común que malloc (o HeapAlloc() etc) un solo bloque de memoria al inicio del programa y administrar la asignación en esto usted mismo, esto puede ser más eficiente si sabe que va a crear/descartando una gran cantidad de pequeños bloques de memoria regularmente.

4

In * nix, malloc() se implementa en el nivel de la biblioteca C. Utiliza brk()/sbrk() para hacer crecer/reducir el segmento de datos, y mmap/munmap para solicitar/liberar asignaciones de memoria. Consulte this page para obtener una descripción de la implementación de malloc utilizada en glibc y uClibc.

+0

Es útil. Gracias. – Squall

0

recolector de basura es lento

Ésta es una afirmación completamente sin sentido. En muchas situaciones prácticas, los programas pueden obtener un impulso de rendimiento significativo mediante el uso de un recolector de basura, especialmente en escenarios de subprocesos múltiples. En muchas otras situaciones, los recolectores de basura incurren en una penalización de rendimiento.

+0

¿qué tal el recolector de basura es * generalmente * lento – Chani

0

Pruebe http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html para los punteros.

Esta es una breve comparación de rendimiento, con punteros a ocho implementaciones diferentes de malloc/free. Un buen punto de partida, porque unas pocas buenas estadísticas de referencia lo ayudarán a determinar si ha mejorado las implementaciones disponibles, o no.