Estoy implementando la recolección de elementos no utilizados en un lenguaje de scripting simple API en el que estoy trabajando y he estado leyendo sobre diversas implementaciones de la recolección de elementos no utilizados. Las API como Lua utilizan marcas y barridos con listas blancas, grises y negras.¿Por qué blanco/gris/negro en GC?
El problema es que parece que no puedo encontrar una explicación de por qué hay tales listas y por qué se ponen en estos colores específicos.
En mi implementación actual y trivial, simplemente uso estados "muertos" o "vivos". En el barrido, los objetos muertos se eliminan. Estoy usando el montón nativo, así que no estoy moviéndome en mi GC.
lo estoy escribiendo en C.
// Performs a full garbage collection
void GorCollect(GorContext *ctx)
{
Value *v, *end;
Collectable *c, *n;
// mark stack references
end = ctx->stack + ctx->stackTop + 1;
v = ctx->stack;
while(v != end)
{
if (gvisgc(v) && v->v.gc) // mark if a collectable obj
Mark(v->v.gc);
v = v++;
}
// mark global references
if (ctx->global)
Mark((Collectable *)ctx->global); // ctx->global is a collectable obj
// perform sweep
c = ctx->gchead; // full list of collectable objs
ctx->gchead = 0;
while(c) {
n = c->next;
// destroy unmarked collectable
if (!c->marked)
FreeCollectable(ctx, c);
// rebuild gc list (singly-linked)
else
{
c->marked = 0;
if (!ctx->gchead)
c->next = 0;
else
c->next = ctx->gchead;
ctx->gchead = c;
}
c = n;
}
}
'por qué se ponen en estos colores específicos' porque son hermosos! – asaelr
La búsqueda de "marcar y borrar blanco gris negro" me llevó a: http://www.memorymanagement.org/glossary/t.html#tri-color.marking. Esa página hace un punto de mencionar que una propiedad importante del algoritmo es que es "correcto", así que supongo que el enfoque ingenuo tiene algún caso extremo en el que se rompe. – millimoose
También: http://en.wikipedia.org/wiki/Mark_and_sweep#Naive_mark-and-sweep enumera como la principal desventaja del enfoque ingenuo que no se puede realizar sin suspender el proceso. – millimoose