Sto implementando la garbage collection mark-and-sweep in una semplice API di scripting su cui sto lavorando e sto leggendo su varie implementazioni della garbage collection. API come Lua usano il mark-and-sweep con liste bianche, grigie e nere.Perché bianco/grigio/nero in GC?
Il problema è che non riesco a trovare spiegazioni sul perché ci siano tali elenchi e sul perché siano inseriti in questi colori specifici.
Nella mia attuale, banale implementazione, uso semplicemente stati "morti" o "vivi". Nella spazzata, gli oggetti morti vengono cancellati. Sto usando l'heap nativo quindi non sto facendo alcun movimento nel mio GC.
sto scrivendo in 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;
}
}
'perché sono messi in questi colori specifici' - perché sono belli! – asaelr
La ricerca di "mark and sweep white gray black" mi ha portato a: http://www.memorymanagement.org/glossary/t.html#tri-color.marking. Quella pagina fa notare che un'importante proprietà dell'algoritmo è "corretta", quindi la mia ipotesi sarebbe che l'approccio ingenuo abbia qualche limite in cui si rompe. – millimoose
Inoltre: http://en.wikipedia.org/wiki/Mark_and_sweep#Naive_mark-and-sweep elenca come il principale svantaggio dell'approccio ingenuo che non può essere eseguito senza sospendere il processo. – millimoose