1

我在 C 中有这个问题,我必须实现一个垃圾收集器。我坚持这样一个事实,即我被赋予了 4 个功能来完成,并且不确定它们如何相互连接。我不知道该怎么办。这是我到目前为止所拥有的:

void mygc() {
  //int **max = (int **) 0xbfffffffUL;   // the address of the top of the stack
  unsigned long stack_bottom;
  int **max =  (int **) GC_init();   // get the address of the bottom of the stack
  int* q;
  int **p = &q;    // the address of the bottom of the stack

  while (p < max) {
    //printf("0. p: %u, *p: %u max: %u\n",p,*p,max);
    mark(*p);
    p++;
  }

  //utilize sweep and coalesce (coalesce function already written)
}

void mark(int *p) {
  int i;
  int *ptr;
  //code here
}

void sweep(int *ptr) {
  // code here
}

int *isPtr(int *p) {  
 //return the pointer or NULL
  int *ptr = start;

  //code here
 }
4

1 回答 1

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)
    }
}

显然,该伪代码中没有处理很多细节。但希望它足以回答您最初的问题,即这四个功能如何组合在一起。

于 2015-05-03T22:52:55.253 回答