Я написал простой сборщик мусора для виртуальной машины Postscript, и у меня возникают трудности при разработке достойного набора правил для того, когда делать коллекцию (когда свободный список слишком короткий?) И когда выделять новыепробел (когда много места для использования?).
Я уже писал снизу вверх, но этот вопрос касается дизайна верхнего уровня.Поэтому я чувствую, что нахожусь в шаткой земле.Все объекты управляются, и доступ осуществляется только через операторские функции, поэтому это коллектор в C, а не для C.
Основная функция распределителя называется gballoc
:
unsigned gballoc(mfile *mem, unsigned sz) {
unsigned z = adrent(mem, FREE);
unsigned e;
memcpy(&e, mem->base+z, sizeof(e));
while (e) {
if (szent(mem,e) >= sz) {
memcpy(mem->base+z, mem->base+adrent(mem,e), sizeof(unsigned));
return e;
}
z = adrent(mem,e);
memcpy(&e, mem->base+z, sizeof(e));
}
return mtalloc(mem, 0, sz);
}
Я уверен, что это бессмысленно, не зная, что означают все типы и функции, поэтому вот псевдокод той же функции:
gballoc
load free list head into ptr
while ptr is not NULL
if free element size is large enough
return element, removed from list
next ptr
fallback to allocating new space
Итак, сначала все просто-подход "без резьбы (но выделения сохраняют свой размер; таким образом, большое пространство, повторно используемое для маленького объекта, может быть повторно использовано для большого объекта, позже).
Но когда я должен вызвать collect()
?
Редактировать: Остальной код и связанные с ним модули были размещены в comp.lang.postscript, в ветке: http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/56c1734709ee33f1#