나는 간단한 스크립트 언어 API에서 마크 앤 스위프 가비지 콜렉션을 구현 중이며 다양한 가비지 콜렉션 구현에 대해 읽고있다. 루아와 같은 API는 흰색, 회색 및 검은 색 목록이있는 마크 앤 스위프를 사용합니다.왜 GC에서 흰색/회색/검은 색입니까?
문제는 이러한 목록이있는 이유에 대한 설명과 왜 이러한 특정 색을 넣을 수 있는지에 대한 설명을 찾을 수없는 것입니다.
현재 사소한 구현에서 "죽은"또는 "활성"상태 만 사용합니다. 스윕에서 죽은 개체는 삭제됩니다. 네이티브 힙을 사용하고 있으므로 GC에서 움직이지 않습니다. 회색 블록의 모든 후손이 아직 검은 색으로 표시되지 않았을 :
내가 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;
}
}
왜 그들이이 특별한 색을 띠지? - 아름답 기 때문에! – asaelr
"마크 앤 스위프 화이트 그레이 블랙"을 검색하면 http://www.memorymanagement.org/glossary/t.html#tri-color.marking으로 연결됩니다. 이 페이지는 알고리즘의 중요한 속성이 "정확하다"는 점을 지적하기 때문에 순진한 접근 방식은 깨지기 쉬운 부분이 있습니다. – millimoose
또한 http://en.wikipedia.org/wiki/Mark_and_sweep#Naive_mark-and-sweep는 프로세스를 중단하지 않고 수행 할 수 없다는 순진 방식의 주요 단점으로 나열합니다. – millimoose