1

我在理解 BoehmGC 分配方案时很头疼 - GC_malloc. 我不知道它是如何分配内存的,也没有看到任何GC_malloc内部调用的 malloc 或 mmap。

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

非常感谢提前。 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 }
4

2 回答 2

0

查看实现os_deps.c(大多数)依赖于操作系统的功能的文件。

mmap如果配置为使用 Boehm-GC,则可以使用它。(见各种GC_unix_get_mem(bytes)功能。)

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

于 2011-09-07T10:53:43.537 回答
0

有两种可能:

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

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

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

其中opp有一个指向“空闲”对象列表的指针。

可能会检查该if列表中是否有任何块。如果没有 ( == 0),那么它使用GENERAL_MALLOC.

于 2011-09-07T10:48:44.883 回答