签到

05月06日
尚未签到

共有回帖数 0

    花非花雾非雾

    等级:
     minigc是一个适用于C语言的迷你垃圾回收器,它和BDWGC(http://www.hpl.hp.com/personal /Hans_Boehm/gc/)、tinygc(http://tinygc.sourceforge.net/)一样都是保守垃圾回收器(即可能不会 回收所有垃圾的回收器)。
      minigc只是玩具代码,它不支持多线程处理和终结器,如果想找专业的,还是推荐BDWGC(好像在Linux中用-lgc就可以使用 BDWGC),tinygc用于学习研究也不错,它是BDWGC接口子集的一个独立实现,它本是一名为jcgo的开源项目的一部分,支持多线程处理、终结 器、动态链接(前两个我现在基本懂了,不过这动态链接还是没有搞明白),它们的处理都可以参考tinygc的源代码,不过tinygc的源代码实在不敢恭 维,你可得做好心理准备(BDWGC的也很糟),如果你打算去读tinygc或BDWGC的源代码,或许minigc可以为你打个基础。
      minigc的源代码没有加注释,不过相信你会很容易看明白的(因为那么杂乱的tinygc源代码我都看过来了)。有几点需要注意:第一,动态增长的 散列表是minigc的(从而也是tinygc的)主要数据结构,绝大部分的函数都是在处理这散列表,而函数内部实现的绝大部分也都是在处理单链表(查 找、插入、删除等),所以读读这源代码对数据结构的学习也是很有益处的(我是学生);第二,保守垃圾回收器重要的一点是确实堆栈的起始地址,所以一定注意 gc-stack结构是怎样被赋值(变化)的,如果你想自己做一个保守垃圾回收器,这就是你要唯一注意的技巧,因为其他不过是数据结构的处理(我 之前弄过一个简化版本,散列表的大小固定便于处理,但弄了半天就是无法工作,局部指针变量引用的对象老是被错误回收,后经查明就是这一个技巧没弄明白); 第三,setjmp这个特殊函数用于将寄存器的值放到局部变量(堆栈中),这样扫描堆栈就可以了;第四,minigc/tinygc都使用了延迟回填的功 能,这样可提高效率,且使用了marked_list和follow_list两个链表,它们在某种程度上说是实现了对象的分代回收;第 五,static_root的处理其实没有必要那么复杂,如果你愿意,搞成几行代码都行;第六,minigc与tinygc是非常相似的,不过由于我不处 理多线程,对回收函数调用时机的确定有很大的不同。
      想将源代码搞成个开源发布,但我不懂具体应该怎么弄,干脆就直接这样啦,相信这玩具代码也不可能用于“商业用途”。还是非常期待C++ 0x(1x?)中垃圾回收支持的加入,那样我想做个Scheme解释器也可以简单一点,欢迎大家与我交流。
    http://blog.csdn.net/shoulea/archive/2011/04/10/6314066.aspx
    http://download.csdn.net/source/3178604

    楼主 2015-11-26 14:20 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知