5.4 配置选项
Ptmalloc的配置选项不多,在 3.2.6 节已经做过概要描述,这里给出 mallopt() 函数的实现:
#if __STD_C
int mALLOPt(int param_number, int value)
#else
int mALLOPt(param_number, value) int param_number; int value;
#endif
{
mstate av = &main_arena;
int res = 1;
if(__malloc_initialized < 0)
ptmalloc_init ();
(void)mutex_lock(&av->mutex);
/* Ensure initialization/consolidation */
malloc_consolidate(av);
switch(param_number) {
case M_MXFAST:
if (value >= 0 && value <= MAX_FAST_SIZE) {
set_max_fast(value);
}
else
res = 0;
break;
case M_TRIM_THRESHOLD:
mp_.trim_threshold = value;
mp_.no_dyn_threshold = 1;
break;
case M_TOP_PAD:
mp_.top_pad = value;
mp_.no_dyn_threshold = 1;
break;
case M_MMAP_THRESHOLD:
#if USE_ARENAS
/* Forbid setting the threshold too high. */
if((unsigned long)value > HEAP_MAX_SIZE/2)
res = 0;
else
#endif
mp_.mmap_threshold = value;
mp_.no_dyn_threshold = 1;
break;
case M_MMAP_MAX:
#if !HAVE_MMAP
if (value != 0)
res = 0;
else
#endif
mp_.n_mmaps_max = value;
mp_.no_dyn_threshold = 1;
break;
case M_CHECK_ACTION:
check_action = value;
break;
case M_PERTURB:
perturb_byte = value;
break;
#ifdef PER_THREAD
case M_ARENA_TEST:
if (value > 0)
mp_.arena_test = value;
break;
case M_ARENA_MAX:
if (value > 0)
mp_.arena_max = value;
break;
#endif
}
(void)mutex_unlock(&av->mutex);
return res;
}
Mallopt() 所设置的字段在 5.3.2 节中做过详细介绍,这里不再作详细分析,需要提一下的是,在 mallopt() 函数配置前,需要检查主分配区是否初始化了,如果没有初始化,调用 ptmalloc_init() 函数初始化 ptmalloc ,然后获得主分配区的锁,调用 malloc_consolidate() 函数, malloc_consolidate() 函数会判断 主分配区是否已经 初始化 ,如果没有,则初始化主分配区。同时我们也看到, mp_ 都没有锁,对 mp_ 中参数字段的修改,是通过主分配区的锁来同步的。
本文深入探讨了Ptmalloc配置选项的功能与作用,包括如何通过mallopt()函数进行配置,以及这些配置对内存管理的影响。重点介绍了参数如M_MXFAST、M_TRIM_THRESHOLD等的设置细节,并阐述了它们如何优化内存使用效率。
3045

被折叠的 条评论
为什么被折叠?



