5.7.2.2 分配small bin chunk
如果所需的
chunk
大小属于
small bin
,则会执行如下的代码:
/*
If a small request, check regular bin. Since these "smallbins"
hold one size each, no searching within bins is necessary.
(For a large request, we need to wait until unsorted chunks are
processed to find best fit. But for small ones, fits are exact
anyway, so we can check now, which is faster.)
*/
if (in_smallbin_range(nb)) {
idx = smallbin_index(nb);
bin = bin_at(av,idx);
if ( (victim = last(bin)) != bin) {
if (victim == 0) /* initialization check */
malloc_consolidate(av);
else {
bck = victim->bk;
if (__builtin_expect (bck->fd != victim, 0))
{
errstr = "malloc(): smallbin double linked list corrupted";
goto errout;
}
set_inuse_bit_at_offset(victim, nb);
bin->bk = bck;
bck->fd = bin;
if (av != &main_arena)
victim->size |= NON_MAIN_ARENA;
check_malloced_chunk(av, victim, nb);
void *p = chunk2mem(victim);
if (__builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
}
}
}
如果分配的
chunk
属于
small bin
,首先查找
chunk
所对应
small bins
数组的
index
,然后根据
index
获得某个
small bin
的空闲
chunk
双向循环链表表头,然后将最后一个
chunk
赋值给
victim
,如果
victim
与表头相同,表示该链表为空,不能从
small bin
的空闲
chunk
链表中分配,这里不处理,等后面的步骤来处理。如果
victim
与表头不同,有两种情况,如果
victim
为
0
,表示
small bin
还没有初始化为双向循环链表,调用
malloc_consolidate()
函数将
fast bins
中的
chunk
合并。否则,将
victim
从
small bin
的双向循环链表中取出,设置
victim chunk
的
inuse
标志,该标志处于
victim chunk
的下一个相邻
chunk
的
size
字段的第一个
bit
。从
small bin
中取出一个
chunk
也可以用
unlink()
宏函数,只是这里没有使用。
接着判断当前分配区是否为非主分配区,如果是,将
victim chunk
的
size
字段中的表示非主分配区的标志
bit
清零,最后调用
chunk2mem()
函数获得
chunk
的实际可用的内存指针,将该内存指针返回给应用层。到此从
small bins
中分配
chunk
的工作完成了,但我们看到,当对应的
small bin
中没有空闲
chunk
,或是对应的
small bin
还没有初始化完成,并没有获取到
chunk
,这两种情况都需要后面的步骤来处理。
分享到:
相关推荐
NULL 博文链接:https://mqzhuang.iteye.com/blog/1064966
Glibc内存管理 Ptmalloc2 源代码分析
glibc内存管理ptmalloc源代码分析-电子资料-高清PDF版-pdf打印版
简介133.2.2内存管理的设计假设 143.2.3内存管理数据结构概述 143.2.4内存分配概述 193.2.5内存回收概述 213.2.6配置选项概述 2
淘宝网的研发人员写的文档,对了解GNU C的内存分配机制有很大的帮助!
该文档详细分析了c库中的内存管理细节,可广大程序员做参考。
简介133.2.2内存管理的设计假设 143.2.3内存管理数据结构概述 143.2.4内存分配概述 193.2.5内存回收概述 213.2.6配置选项概述 2
清晰版,对内存分析,程序设计非常有帮助。适合进阶的。
本文通过Glibc的内存暴增问题,主要介绍了系统的内存管理问题,具体如下: 目录 1. 问题 2. 基础知识 2.1 X86平台Linux进程内存布局 2.1.1 32位模式下进程内存经典布局 2.1.2 32位模式下进程默认内存布局 ...
glibc内存管理ptmalloc源代码分析.pdf
源代码分析 glibc的ptmalloc 分析
glibc内存管理ptmalloc源代码分析4.pdf
学习自《glibc内存管理ptmalloc源代码分析》庄明强 著 部分资料参考自互联网 chunk 描述: 当用户通过malloc等函数申请空间时,实际上是从堆中分配内存 目前 Linux 标准发行版中使用的是 glibc 中的堆分配器:...