在理解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 }发布于 2011-09-07 18:48:45
有两种可能性:
,
GENERAL_MALLOC (两次返回)给出的指针,,
op = *opp (包含EXPECT的那一行),然后返回op。我会说第二个是重用释放的块。对于第二种情况:在if之前查看opp的值
opp = (void **)&(GC_objfreelist[lg]);在opp中,有一个指向“空闲”对象列表的指针。
if可能会检查该列表中是否有任何块。如果没有(== 0),则使用GENERAL_MALLOC。
发布于 2011-09-07 18:53:44
(请参阅各种GC_unix_get_mem(bytes)函数。)
如果未使用mmap,则另一个(裸)分配器使用sbrk。
https://stackoverflow.com/questions/7332412
复制相似问题