2015-05-03 4 views
0

У меня есть эта проблема на C, где я должен реализовать сборщик мусора. Я застрял в том, что мне дали 4 функции для завершения и не знаю, как они соединяются друг с другом. Я не уверен, что делать. Это то, что у меня есть до сих пор:Реализация Mark Sweep Сборщик мусора в C

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 
} 
+0

переменная; 'stack_bottom' не используется. это вызывает предупреждение компилятора. предложите включить все предупреждения компилятора, перекомпилировать, исправить предупреждения, повторно опубликовать код. учитывая опубликованный код, есть несколько других предупреждений компилятора. Пожалуйста, отправьте код, который компилирует/ссылки, чтобы мы могли отладить проблему – user3629249

+0

, возможно, было бы полезно, если бы вы включили описания того, что каждая функция должна выполнить. – user3629249

+0

как в стороне, если вы уже не хотите, чтобы вы могли заглянуть в [сборщик бэма] (https://github.com/ivmai/bdwgc) – the8472

ответ

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

Есть, очевидно, много деталей, не рассматриваются в этом псевдо коде. Но, надеюсь, этого будет достаточно, чтобы ответить на ваш первоначальный вопрос, каким образом эти четыре функции сочетаются друг с другом.

Смежные вопросы