2011-03-14 16 views
12

Estoy leyendo sobre implementaciones de recolectores de basura, específicamente sobre colectores de marcación y barrido sobre la marcha, y el hecho de que los mutadores funcionan cuando la etapa de marcado no está terminada (y para evitar detener el mundo) se debe usar una barrera de memoria.Implementación de barrera de memoria para un recolector de basura

Así, por ejemplo, si un objeto marcado (negro) es modificado por el mutador para apuntar a un objeto sin marcar (blanco), el objeto blanco debe marcarse en gris (marcado como vivo pero no escaneado aún).

Pero no puedo encontrar ningún detalle de cómo se puede implementar: ¿cómo puedo detectar cuándo se cambia un objeto negro y realizar una acción en ese momento?

Respuesta

13

Tal vez la terminología confusa es la culpable. Las llamadas barreras, en la terminología de recolección de basura, generalmente son fragmentos de código que el compilador inserta antes de que el puntero lea y escriba. Por lo tanto, su programa siempre ejecuta el código de barrera antes de cada lectura y escritura. (También puede usar protección de memoria virtual para obtener el efecto de barreras.)

Para mantener la invariante tricolor a la que alude, el colector comprueba el color de un objeto antes de que lo escriba. En este caso, la barrera de escritura puede ejecutar alguna acción siempre que esté a punto de cambiar un objeto negro a uno gris.

Consulte http://www.memorymanagement.org/glossary/s.html#strong.tri-color.invariant para obtener una descripción general, y this article para obtener más información.

+0

¿Pero cómo funciona un coleccionista como boehm gc? No puede insertar código porque funciona en un programa c normal compilado con gcc, por ejemplo. Y leí en alguna parte que usa barreras de memoria. – Damian

+0

Correcto, el recopilador de Boehm usa la protección de VM para implementar barreras. Lo siento si mi comentario entre paréntesis fue críptico. – EmeryBerger

10

estoy leyendo acerca de basura colectores implementaciones, específicamente acerca de marcaje y barrido en la marcha de los coleccionistas, y el hecho de que permite a los mutadores funcionan cuando la etapa de marcado no está terminado (y así evitar parando el mundo) se debe usar una barrera de memoria.

Creo que está confundiendo barreras de escritura y barreras de memoria. Los recolectores de basura usan barreras de escritura para rastrear la topología cambiante del montón. Una barrera de memoria es una primitiva de concurrencia de bajo nivel que impide que las operaciones de memoria se reordenen, tanto por el compilador como por la propia CPU.

Por lo que desea buscar barreras de escritura GC. En particular, los Yuasa, Steele y Dijkstra escriben barreras.

Los recolectores de basura también pueden manejar la mutación sobre la marcha de la topología del montón utilizando barreras de lectura.

Cuestiones relacionadas