我为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,sizeof(e)); } return mtalloc(mem,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#
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。