【问题标题】:BoehmGC - Understanding memory allocator GC_mallocBoehmGC - 了解内存分配器 GC_malloc
【发布时间】:2011-09-07 10:33:02
【问题描述】:

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

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

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

【问题讨论】:

  • GENERAL_MALLOC 扩展为什么?你能通过预处理器运行它并再看一遍吗?
  • @Kerrek SB:在 GCC 中使用 -dM 选项?
  • 在 GCC 中,您可以使用 -E 查看预处理器输出:gcc -E myfile.c | less -- 您将获得大量输出,请查看接近尾声。
  • 我们的目标,不支持 -E 让我在交叉编译器中检查它。
  • @Kerrek SB:它正在扩展到 GC_debug_malloc(4, "prog2.c", 9);谢谢,让我试着追踪一下。

标签: c linux boehm-gc


【解决方案1】:

有两种可能:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    mmap 可以被 Boehm-GC 使用,如果它被配置为使用它。 (查看各种GC_unix_get_mem(bytes) 函数。)

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

    【讨论】:

    • 啊,谢谢,这比其他回复更接近。让我检查一下。
    • 是的,在那里使用了 mmap,但我看不到 GC_malloc 在哪里调用它。
    • result = mmap(last_addr, bytes, PROT_READ | PROT_WRITE | OPT_PROT_EXEC, GC_MMAP_FLAGS | OPT_MAP_ANON, zero_fd, 0/* offset */);
    • 完整的调用链可能相当棘手,尤其是在中间如何使用宏以及各种缓存。如果您想完全理解它,则需要研究该代码(和/或 Boehm-GC 主页上的相关研究材料)。
    • 好的..是的。在这两者之间,如果您能(在您的时间)了解有关此调用链的一些信息,这将对我有很大的帮助:)
    猜你喜欢
    • 2019-07-08
    • 2021-06-18
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多