我为一台Postscript虚拟机编写了一个简单的垃圾回收器,但是我难以设计出一个合适的规则来判断何时进行垃圾回收(当空闲列表太短时?)和何时分配新空间(当有大量可用空间时?)。
到目前为止,我已经采用了自下而上的方式,但这个问题涉及到顶层设计。所以我感觉自己站在不稳定的地面上。所有对象都是通过操作函数进行管理和访问的,因此这是一个在C语言内部实现的垃圾回收器,而不是针对C语言的垃圾回收器。
主要的分配器函数被称为
所以,这是一个简单的“首次适配”算法,没有雕刻(但分配保留其大小;因此,用于小对象的大空间可以再次用于较大的对象)。
但是我什么时候应该调用
编辑: 代码的其余部分和相关模块已发布在comp.lang.postscript中的线程中: http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/56c1734709ee33f1#
到目前为止,我已经采用了自下而上的方式,但这个问题涉及到顶层设计。所以我感觉自己站在不稳定的地面上。所有对象都是通过操作函数进行管理和访问的,因此这是一个在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#
vmreclaim
的用户级运算符,可以(启用/禁用)自动收集,或请求立即收集。因此,您的第三个选项已经在规范中涵盖。定期似乎是现在一个合理的选择。我担心最后一招策略会导致启动抖动,除非有一个慷慨的初始池。 - luser droog