BoehmGC - Понимание распределителя памяти GC_malloc

Я ломаю голову в понимании схемы распределения BoehmGC - GC_malloc, Я не понимаю, как он распределяет память, не видел ни malloc, ни mmap, которые GC_malloc внутренне звонки.

Может ли кто-нибудь любезно помочь мне? Любые ссылки или фрагмент кода окажут большую помощь.

Огромное спасибо заранее. Исходный код Boehm GC

 enter code here
 254 /* Allocate lb bytes of composite (pointerful) data */
 255 #ifdef THREAD_LOCAL_ALLOC
 256   void * GC_core_malloc(size_t lb)
 257 #else
 258   void * GC_malloc(size_t lb)
 259 #endif
 260 {
 261     void *op;
 262     void **opp;
 263     size_t lg;
 264     DCL_LOCK_STATE;
 265 
 266     if(SMALL_OBJ(lb)) {
 267         lg = GC_size_map[lb];
 268         opp = (void **)&(GC_objfreelist[lg]);
 269         LOCK();
 270         if( EXPECT((op = *opp) == 0, 0) ) {
 271             UNLOCK();
 272             return(GENERAL_MALLOC((word)lb, NORMAL));
 273         }
 274         /* See above comment on signals.        */
 275         GC_ASSERT(0 == obj_link(op)
 276                   || (word)obj_link(op)
 277                         <= (word)GC_greatest_plausible_heap_addr
 278                      && (word)obj_link(op)
 279                         >= (word)GC_least_plausible_heap_addr);
 280         *opp = obj_link(op);
 281         obj_link(op) = 0;
 282         GC_bytes_allocd += GRANULES_TO_BYTES(lg);
 283         UNLOCK();
 284         return op;
 285    } else {
 286        return(GENERAL_MALLOC(lb, NORMAL));
 287    }
 288 }

2 ответа

Есть две возможности:

  • Возвращает указатель GENERAL_MALLOC (два возвращения)
  • это устанавливает op = *opp (строка с EXPECT) а потом возвращается op, Я скажу, что второе - это повторное использование освобожденных блоков.

Для второго случая: посмотрите на значение opp перед if:

opp = (void **)&(GC_objfreelist[lg]);

В opp есть указатель на "свободный" список объектов.

if вероятно, проверяет, есть ли какой-либо блок в этом списке. Если нет (== 0) тогда он использует GENERAL_MALLOC,

Посмотрите на os_deps.c файл, в котором (большинство) из OS-зависимых функций реализованы.

mmap может использоваться Boehm-GC, если он настроен на это. (См. Различные GC_unix_get_mem(bytes) функции.)

Если mmap не используется, используется другой (пустой) распределитель sbrk,

Другие вопросы по тегам