Pregunta

Revisé Boehm GC. El GC para C/C ++.

Sé algoritmo de Marcos y barridos. Lo que estoy curioso es cómo recoge solo punteros en la memoria C entera. Mi comprensión sobre la memoria C es solo una matriz de bytes simple. ¿Es posible determinar que un valor en la memoria es puntero o no?

¿Fue útil?

Solución

El Boehm GC es un coleccionista conservador, lo que significa que supone que todo es un puntero. Esto significa que puede encontrar referencias falsas positivas, como un entero que casualmente tiene el valor de una dirección en el montón. Como resultado, algunos bloques pueden permanecer en la memoria más tiempo que con un coleccionista no conservador.

Aquí hay una descripción de Página de Boehm:

El recolector de basura utiliza un algoritmo de barrido de marca modificado. Conceptualmente opera aproximadamente en cuatro fases, que se realizan ocasionalmente como parte de una asignación de memoria:

  1. Preparación Cada objeto tiene un bit de marca asociado. Borre todos los bits de marca, lo que indica que todos los objetos son potencialmente inalcanzables.
  2. La fase de marca marca todos los objetos que se pueden accesibles a través de cadenas de punteros de variables. A menudo, el recolector no tiene información real sobre la ubicación de las variables de puntero en el montón, por lo que ve todas las áreas de datos estáticos, pilas y registros como potencialmente que contienen punteros. Los patrones de bits que representan direcciones dentro de los objetos de montón administrados por el coleccionista se consideran punteros. A menos que el programa del cliente haya puesto a disposición del coleccionista la información de diseño del objeto Heap, cualquier objeto de montón que se puede accesible de las variables se escanean nuevamente de manera similar.
  3. La fase de barrido escanea el montón para objetos inaccesibles y, por lo tanto, sin marcar, y los devuelve a una lista gratuita apropiada para su reutilización. Esta no es realmente una fase separada; Incluso en modo no incremental, esta operación generalmente se realiza a pedido durante una asignación que descubre una lista gratuita vacía. Por lo tanto, es muy poco probable que la fase de barrido toque una página que no se habría tocado poco después de todos modos.
  4. Fase de finalización Los objetos inalcanzables que se habían registrado para la finalización están enqueados para la finalización fuera del coleccionista.

También debe saber que el BOEHM GC debe recibir un conjunto de "raíces", que son puntos de partida para el algoritmo de marcado y barrido. La pila y los registros son raíces automáticamente. Debe agregar explícitamente punteros globales como raíces.


EDITAR: En los comentarios, se señalaron algunas preocupaciones sobre los coleccionistas conservadores en general. Es cierto que los enteros que parecen punteros de montón para el coleccionista pueden hacer que la memoria no se libere. Este no es un problema tan grande como podría pensar. La mayoría de los enteros escalares en un programa se utilizan para conteos y tamaños y son bastante pequeños (por lo que no parecen punteros de montón). En su mayoría se encontraría con problemas con matrices que contienen mapas de bits, cuerdas, datos de puntos flotantes o cualquier cosa de ese tipo. Boehm GC te permite asignar un bloque con GC_MALLOC_ATOMIC lo que indica al coleccionista que el bloque no contendrá ningún puntería. Si miras en gc_typed.h, también encontrará formas de especificar qué partes de un bloque pueden contener punteros.

Dicho esto, una limitación fundamental de un coleccionista conservador es que no puede mover la memoria de manera segura durante la recolección, ya que la reescritura de puntero no es segura. Esto significa que no obtendrá ninguno de los beneficios de la compactación, como la fragmentación reducida y el mejor rendimiento del caché.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top