BoehmGC - 了解内存分配器GC_malloc

时间:2011-09-07 10:33:02

标签: c linux boehm-gc

我在理解BoehmGC分配方案时遇到了麻烦 - GC_malloc。我没有得到它如何分配内存,没有看到GC_malloc内部调用的任何malloc或mmap。

有人可以帮助我吗?任何链接或代码段都会有很大的帮助。

提前非常感谢。 Boehm GC source code

 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 个答案:

答案 0 :(得分:0)

有两种可能性:

  • 它返回由GENERAL_MALLOC(两个返回)
  • 给出的指针
  • 设置op = *opp(包含EXPECT的行),然后返回op。我会说第二个是重用已释放的块。

对于第二种情况:在opp之前查看if的值:

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

opp中有一个指向“免费”对象列表的指针。

if可能会检查该列表中是否有任何阻止。如果没有(== 0)则会使用GENERAL_MALLOC

答案 1 :(得分:0)

查看os_deps.c文件,其中(大多数)依赖于操作系统的函数。

如果Boehm-GC配置为使用它,则可以使用

mmap。 (参见各种GC_unix_get_mem(bytes)函数。)

如果未使用mmap,则另一个(裸)分配器使用sbrk