在C中实现Mark Sweep垃圾收集器

时间:2015-05-03 20:52:25

标签: c garbage-collection mark-and-sweep

我在C中有这个问题,我必须实现垃圾收集器。我坚持认为我有4个功能可以完成而不确定它们是如何相互连接的。我不知道该怎么做。这就是我到目前为止所做的:

    function setRadius(value) {
        self.radius = value;
    }

    function resize(event) {
        if ($(window).width() > 600) {
            setRadius(.9 * Math.random() + 10);
        } else {
            setRadius(.9 * Math.random() + 2);
        }
    }

    resize();
    $(window).on('resize', resize);   

1 个答案:

答案 0 :(得分:1)

如果您甚至不理解这个问题,或许最好与您的教学人员交谈。为了让你从这里开始,这是一般的想法。

  • mygc显然是执行GC的顶级功能。
  • 调用
  • mark来标记内存位置/对象在使用中。它还需要将该位置/对象引用的所有内存标记为正在使用(递归)。
  • sweep被调用以取消标记所有先前标记的内存并声明(垃圾收集)那些未标记的位置。
  • 调用
  • isPtr来确定内存位置是否是指针(而不是任何其他数据)。 mark使用它来了解是否需要标记内存位置。

所以将所有伪代码放在一起就是:

mygc()
{
    loc_list = get stack extents and global variables
    foreach (p in loc_list) {
        if (isPtr(p)) {
            mark(p)
        }
    }

    foreach (p in heap) {
        sweep(p)
    }
}

很明显,很多细节都没有在psuedo代码中处理过。但它应该足以回答你原来的问题,即四个函数如何组合在一起。