目录
一、堆
1.堆的介绍
主要是指用户动态申请的内存(如:调用malloc,alloc,alloca,new等函数)。glibc malloc源码中有三种最基本的堆块数据结构,分别是heap_info,malloc_state,malloc_chunk。
2.堆的基本数据结构chunk
在glibc中,chunk是内存分配的基本单位,可分为alloced chunk,free chunk,top chunk,last remainder chunk四种,最后一种用的比较少,这里着重介绍前三种。
(1)mallco_chunk数据结构
① pre_size/pre_data
前一堆块释放(P=0):前一堆块大小
前一堆块使用(P=1):前一堆块数据
②size
本chunk大小,size为8的整数倍,所以后三个字节有特殊用途
内存中,堆块对齐规则如下:
x32中,按0x8字节对齐,chunk最小为0x10字节;x64中,按0x10字节对齐,chunk最小为0x20字节
(2)free chunk
空闲堆块,其中的fd,bk属于链表指针,有特定的含义,下一堆块的pre_size为当前释放块的大小(含头部信息),下一堆块size域中的p标志通常会被设为0(存在例外,如fast bin)
(3)top chunk
空闲块,该块位于前两种堆块之后,其堆块结构与alloced块的结构类似,重要的是pre_size域和size域。
(4)N,M,P位
N位:#define NON_MAN_ARENA 0x4.用于表示是否属于主线程,0表示主线程的堆块结构,1表示子线程的堆块结构
M位:#define IS_MMAPPED 0x2。用于表示是否由mmap分配,0表示堆块中的top chunk分裂产生,1表示由mmap分配
P位:#define PREV_INUSE 0x1.用于表示上一堆块是否处于空闲状态,0表示处于空闲状态,1表示处于使用状态(被分配),此位主要用来判断free时是否能遇上一堆快进行合并。不过,也存在例外情况,如,fastbin,为了满足快速分配小内存的需求,通常fastbin中的p位保持为1,不参与合并。
3.堆空闲块管理结构bin
当alloced chunk被释放后,会放入bin或者合并到top chunk中去。bin的主要作用是加快分配速度,其通过链表方(chunk结构体中的fd和bk指针)管理
(1)fast bin
fast bin中包含一维指针数组头,用于管理小堆块,在x64系统中,保存的堆块大小在0x20-0x80之间;在x32位系统中,其大小区间0x10-0x40(x86),该区间两边的值都包含在内。fast bin按单链表结构进行组织,用fd指针指向下一堆块,采用LIFO机制,在fast bin中,堆块的p标志都为1,处于占用状态,以防止释放时对fast bin进行合并,用于快速分配小内存