5.2.3
Unsorted bin
Unsorted
bin
可以看作是
small bins
和
large bins
的
cache
,只有一个
unsorted bin
,以双向链表管理空闲
chunk
,空闲
chunk
不排序,所有的
chunk
在回收时都要先放到
unsorted bin
中,分配时,如果在
unsorted bin
中没有合适的
chunk
,就会把
unsorted bin
中的所有
chunk
分别加入到所属的
bin
中,然后再在
bin
中分配合适的
chunk
。
Bins
数组中的元素
bin[1]
用于存储
unsorted bin
的
chunk
链表头。
/*
Unsorted chunks
All remainders from chunk splits, as well as all returned chunks,
are first placed in the "unsorted" bin. They are then placed
in regular bins after malloc gives them ONE chance to be used before
binning. So, basically, the unsorted_chunks list acts as a queue,
with chunks being placed on it in free (and malloc_consolidate),
and taken off (to be either used or placed in bins) in malloc.
The NON_MAIN_ARENA flag is never set for unsorted chunks, so it
does not have to be taken into account in size comparisons.
*/
/* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
#define unsorted_chunks(M) (bin_at(M, 1))
/*
Top
The top-most available chunk (i.e., the one bordering the end of
available memory) is treated specially. It is never included in
any bin, is used only if no other chunk is available, and is
released back to the system if it is very large (see
M_TRIM_THRESHOLD). Because top initially
points to its own bin with initial zero size, thus forcing
extension on the first malloc request, we avoid having any special
code in malloc to check whether it even exists yet. But we still
need to do so when getting memory from system, so we make
initial_top treat the bin as a legal but unusable chunk during the
interval between initialization and the first call to
sYSMALLOc. (This is somewhat delicate, since it relies on
the 2 preceding words to be zero during this interval as well.)
*/
/* Conveniently, the unsorted bin can be used as dummy top on first call */
#define initial_top(M) (unsorted_chunks(M))
上面的宏的定义比较明显,把
bin[1]
设置为
unsorted
bin
的
chunk
链表头,对
top chunk
的初始化,也暂时把
top chunk
初始化为
unsort chunk
,仅仅是初始化一个值而已,这个
chunk
的内容肯定不能用于
top chunk
来分配内存,主要原因是
top chunk
不属于任何
bin
,但
ptmalloc
中的一些
check
代码,可能需要
top chunk
属于一个合法的
bin
。
5.2.4
Fast bins
Fast bins
主要是用于提高小内存的分配效率,默认情况下,
对于
SIZE_SZ
为
4B
的平台,小于
64B
的
chunk
分配请求,对于
SIZE_SZ
为
8B
的平台,小于
128B
的
chunk
分配请求,首先会查找
fast
bins
中是否有所需大小的
chunk
存在(精确匹配),如果存在,就直接返回。
Fast bins
可以看着是
small
bins
的一小部分
cache
,默认情况下,
fast bins
只
cache
了
small bins
的前
7
个大小的空闲
chunk
,也就是说,对于
SIZE_SZ
为
4B
的平台,
fast bins
有
7
个
chunk
空闲链表(
bin
),每个
bin
的
chunk
大小依次为
16B
,
24B
,
32B
,
40B
,
48B
,
56B
,
64B
;对于
SIZE_SZ
为
8B
的平台,
fast bins
有
7
个
chunk
空闲链表(
bin
),每个
bin
的
chunk
大小依次为
32B
,
48B
,
64B
,
80B
,
96B
,
112B
,
128B
。以
32
为系统为例,分配的内存大小与
chunk
大小和
fast bins
的对应关系如下表所示:
Fast bins
可以看着是
LIFO
的栈,使用单向链表实现。
/*
Fastbins
An array of lists holding recently freed small chunks. Fastbins
are not doubly linked. It is faster to single-link them, and
since chunks are never removed from the middles of these lists,
double linking is not necessary. Also, unlike regular bins, they
are not even processed in FIFO order (they use faster LIFO) since
ordering doesn't much matter in the transient contexts in which
fastbins are normally used.
Chunks in fastbins keep their inuse bit set, so they cannot
be consolidated with other free chunks. malloc_consolidate
releases all chunks in fastbins and consolidates them with
other free chunks.
*/
typedef struct malloc_chunk* mfastbinptr;
#define fastbin(ar_ptr, idx) ((ar_ptr)->fastbinsY[idx])
根据
fast bin
的
index
,获得
fast bin
的地址。
Fast bins
的数字定义在
malloc_state
中,
5.3
节会做详细介绍。
/* offset 2 to use otherwise unindexable first 2 bins */
#define fastbin_index(sz) \
((((unsigned int)(sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2)
宏
fastbin_index(sz)
用于获得
fast bin
在
fast bins
数组中的
index
,由于
bin[0]
和
bin[1]
中的
chunk
不存在,所以需要减
2
,对于
SIZE_SZ
为
4B
的平台,将
sz
除以
8
减
2
得到
fast bin index
,对于
SIZE_SZ
为
8B
的平台,将
sz
除以
16
减去
2
得到
fast bin index
。
/* The maximum fastbin request size we support */
#define MAX_FAST_SIZE (80 * SIZE_SZ / 4)
#define NFASTBINS (fastbin_index(request2size(MAX_FAST_SIZE))+1)
/*
FASTBIN_CONSOLIDATION_THRESHOLD is the size of a chunk in free()
that triggers automatic consolidation of possibly-surrounding
fastbin chunks. This is a heuristic, so the exact value should not
matter too much. It is defined at half the default trim threshold as a
compromise heuristic to only attempt consolidation if it is likely
to lead to trimming. However, it is not dynamically tunable, since
consolidation reduces fragmentation surrounding large chunks even
if trimming is not used.
*/
#define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL)
根据SIZE_SZ
的
不同大小,
定义
MAX_FAST_SIZE
为
80B
或是
160B
,
fast bins
数组的大小
NFASTBINS
为
10
,
FASTBIN_CONSOLIDATION_THRESHOLD
为
64k
,当每次释放的
chunk
与该
chunk
相邻的空闲
chunk
合并后的大小大于
64k
时,就认为内存碎片可能比较多了,就需要把
fast bins
中的所有
chunk
都进行合并,以减少内存碎片对系统的影响。
#ifndef DEFAULT_MXFAST
#define DEFAULT_MXFAST (64 * SIZE_SZ / 4)
#endif
/*
Set value of max_fast.
Use impossibly small value if 0.
Precondition: there are no existing fastbin chunks.
Setting the value clears fastchunk bit but preserves noncontiguous bit.
*/
#define set_max_fast(s) \
global_max_fast = (((s) == 0) \
? SMALLBIN_WIDTH: ((s + SIZE_SZ) & ~MALLOC_ALIGN_MASK))
#define get_max_fast() global_max_fast
上面的宏
DEFAULT_MXFAST
定义了默认的
fast
bins
中最大的
chunk
大小,对于
SIZE_SZ
为
4B
的平台,最大
chunk
为
64B
,对于
SIZE_SZ
为
8B
的平台,最大
chunk
为
128B
。
ptmalloc
默认情况下调用
set_max_fast
(s)
将全局变量
global_max_fast
设置为
DEFAULT_MXFAST
,也就是设置
fast bins
中
chunk
的最大值,
get_max_fast
()
用于获得这个全局变量
global_max_fast
的值。
分享到:
相关推荐
《Glibc内存管理--ptmalloc2源代码分析》 Glibc是GNU项目提供的C语言标准库,它在Linux系统中扮演着至关重要的角色。其中,内存管理是Glibc中的核心部分,它负责程序运行时的内存分配与释放,对系统的性能有着深远...
在分析glibc内存管理的ptmalloc源代码之前,我们需要先了解一些基础知识,包括操作系统对内存的分配和管理方法,以及glibc内存分配机制。 内存管理是操作系统的一个核心功能,它负责维护和管理计算机系统中的物理和...
《glibc内存管理ptmalloc源代码分析》是一份深入探讨Linux系统中glibc库内存管理机制的专业资料。glibc,全称GNU C Library,是Linux操作系统下广泛使用的C语言标准库,其中ptmalloc是glibc中负责动态内存分配的核心...
在深入探讨Glibc内存管理的Ptmalloc源代码之前,我们先来了解一下内存管理的基本概念。内存管理是操作系统和编程语言库中的核心组件,它负责有效地分配和回收内存,以确保程序的高效运行和资源的有效利用。 2.1 X86...
通过对ptmalloc源代码的深入分析,可以找到潜在的优化点,如调整分配策略、改进数据结构设计等,以解决这些问题。 #### 13. 使用注意事项 虽然ptmalloc提供了强大的内存管理功能,但在使用过程中也需要注意一些事项...
glibc内存管理ptmalloc源代码分析
在深入探讨Glibc内存管理的Ptmalloc源代码之前,我们先来了解一下内存管理的基本概念和Glibc中的Ptmalloc2。内存管理是操作系统和应用程序中的核心部分,它负责为程序分配和释放内存,以确保资源的有效利用和避免...
### glibc内存管理ptmalloc源代码分析 #### 1. 问题 在开发一款NoSQL系统的过程中,我们遇到一个令人头疼的问题:系统中使用的内存管理模块,在高并发、高负载的场景下,虽然已将内存释放给C运行时库(即glibc),...
### glibc内存管理ptmalloc源代码分析-清晰版 #### 一、背景介绍与文档概览 本文档针对glibc中的ptmalloc2内存管理模块进行了深入的源代码分析,旨在帮助开发者更好地理解ptmalloc的工作原理及其内部机制。文档...
`glibc`是GNU项目提供的C标准库,而`ptmalloc`是它的一部分,负责程序的内存分配与管理。`ptmalloc`优化了内存分配效率,但在某些情况下也可能成为安全漏洞的来源。 `GDB`(GNU调试器)是一款强大的调试工具,它...
#### 五、源代码分析 ##### 5.1 边界标记法 Ptmalloc2采用了边界标记法来跟踪空闲内存块的边界,从而有效地管理内存。 ##### 5.2 分箱式内存管理 Ptmalloc2采用了一种称为分箱式内存管理的技术来组织不同大小的...
通过对glibc库中的ptmalloc源代码进行深入分析,我们不仅了解了其内部实现机制,还能够针对实际应用中的内存管理问题提出有效的解决方案。这对于提升程序性能、减少内存碎片以及提高系统的整体稳定性具有重要意义。...
学习自《glibc内存管理ptmalloc源代码分析》庄明强 著 部分资料参考自互联网 chunk 描述: 当用户通过malloc等函数申请空间时,实际上是从堆中分配内存 目前 Linux 标准发行版中使用的是 glibc 中的堆分配器:...
《堆漏洞的利用技巧》 堆溢出是计算机安全领域中的一个重要...同时,阅读glibc内存管理的源代码分析对于提高理解和实践能力非常有帮助。通过这些知识的学习,不仅可以增强安全意识,也能提升在CTF竞赛中的攻防能力。