2009-07-28 10 views
22

Me gustaría escribir mi propio administrador de memoria. El idioma de destino es C++ y el objetivo del administrador de memoria es principalmente ayudar a la depuración. Debe detectar doble frecuencia, sobreescritura de memoria, etc. Y, por supuesto, me gustaría aprender sobre administración de memoria.Escriba su propio administrador de memoria

¿Puede alguien darme una pista para que los recursos donde puedo aprender a escribir ese administrador de memoria?

Gracias por su ayuda.

Respuesta

30

Creo que este es un proyecto muy interesante que podría aprender mucho de. Aquí hay un poco de material de lectura sobre el tema de la gestión de la memoria. Repasa algunos de los conceptos básicos de la gestión de memoria, conduce a una implementación simple de malloc y luego toca un par de temas más avanzados.

Inside memory management

Además, dado que usted menciona que usted desea hacer un administrador de memoria que es útil para la depuración, es posible que desee considerar la posibilidad de leer este documento por los desarrolladores de Memcheck/Valgrind (Un depurador de memoria maravillosa para Linux) Detalla cómo rastrean todos los metadatos (si un byte en particular está definido, inicializado, etc.) en memchck.Es un poco detallado, pero es una buena lectura sobre cómo hacer un comprobador de memoria dinámico escalable y eficiente.

How to Shadow Every Byte of Memory Used by a Program

2

He visto algunas muestras que usan una macro de preprocesador C para malloc. Es una idea inteligente. Estoy seguro de que podrías escribir algo así.

Aquí hay un aspecto como un buen punto de partida.

http://stevehanov.ca/blog/index.php?id=10

-2

¿Cuál es su plataforma? ¿Solo está pensando si valgrind o lint podría ayudarlo antes de ir y tratar de volver a instalar el fregadero de la cocina?

+2

seguro, pero no aprenderé nada. –

+0

¿No aprenderá nada en términos de técnica de codificación al usar Valgrind para detectar sus fugas? Seguramente si está utilizando una forma defectuosa de destruir objetos (o liberarlos según su plataforma), entonces lo descubrirá muy rápidamente. Veo valor en la implementación de un montón, etc. para ver cómo se hace, pero es un gran esfuerzo en sí mismo hacer las cosas bien, y te deja con más cosas para depurar cuando tienes un problema. – Spence

+0

Si lo hago por trabajo, tienes toda la razón. No hay razón para volver a implementar la rueda. Pero para la diversión y el aprendizaje, solo el uso de valgrind no da la información y la diversión. Pero aprecio tu forma de pensar, Spence. Lo primero que debe hacer si comienza a programar es verificar si alguien ya hizo su trabajo. La mayoría de las veces lo hicieron mejor que tú. –

1

Hay un gran administrador de memoria de código abierto escrito en Delphi: fastMM4. Podría ser de valor echarle un vistazo. Es compatible con muchas de las características que desea implementar y, por lo tanto, podría ser una gran muestra.

0

Puede implementar la mayor parte en términos de malloc y libre, de hecho, se implementan muchos administradores de memoria C++, incluso si no tienen que serlo.

Puede comenzar con una implementación simple que mantiene un registro de todas las asignaciones y desasignaciones, pero reenvía las asignaciones/desasignaciones regulares a malloc y gratuitas. Obviamente, la aplicación simple no debe utilizar la nueva/Eliminar cualquiera ...

Así que, para empezar se puede

  • llegar a la estructura de datos que registra las asignaciones y cancelaciones de asignación
  • implementarlo en su mayoría "C al estilo", aunque se puede utilizar la colocación de nuevo para asegurarse de constructores son llamados
  • implementar nuevas global y borrar como envoltorios que registre por primera vez el acceso en la estructura de datos anterior y luego desviar la llamada a malloc o libre
1

Como dijo @Spence, esto ya se ha hecho muchas veces. Pero por el bien de aprender, es bastante interesante.

podría sugerir que echar un vistazo a --wrap de LD Here ya que es útil

+0

Este es un muy buen primer paso para interceptar llamadas nuevas() y eliminar(). Vea la publicación de Falaina sobre las complejidades de la detección de sobrepasados ​​en el array: una bestia diferente – Matt

0

Creo que se podría comenzar con una implementación puntero inteligente que utiliza el conteo de referencia básica en el fondo. Estos son conceptos básicos de administración de memoria y te mojarán los pies. Desde allí puede usar sus implementaciones para crear un administrador de memoria más avanzado.

0

"Valla eléctrica" ​​es un punto de partida básico que puede ser útil. Esencialmente tiene implementaciones personalizadas de malloc y gratuitas que proporcionan la depuración.

Sin embargo, AFAIK no se integra en los operadores nuevos/eliminar de C++, aunque no sería demasiado extenso para proporcionar implementaciones globales nuevas/eliminadas personalizadas que difieran de las rutinas de cercas eléctricas.

4

de Dave Hanson C Interfaces and Implementations presenta por primera vez un administrador de memoria estándar y luego un administrador de memoria con algunas características de depuración. Este sería un gran punto de partida para aprender y ampliar.

Por supuesto, si realmente desea diagnosticar problemas de memoria en un programa C o C++ en ejecución, debe usar valgrind.

Cuestiones relacionadas