跳至主要內容

堆(Heap)

西风逍遥游大约 1 分钟

堆(Heap)

sbrk与mmap

运行时堆一般是通过调用malloc向上(高地址)增长,如上图所示具体是通过sbrk函数移动内核中的一个叫做brk的指针来控制堆的。但是在实际的Linux中并不是所有通过malloc申请的动态内存都是通过sbrk增长堆来申请空间的。具体策略是:

当malloc申请的内存小于128KB时,是通过sbrk增长运行时堆来获取内存空间的。 当malloc申请的内存大于128KB时,是通过mmap函数进行系统映射获取内存空间的。

void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);

mmap函数要求内核创建一个新的虚拟存储器区域,最好是从地址start开始的一个区域,并将文件描述符fd指定的对象的一个连续的片(chunk)映射到这个新的区域。连续的对象片大小为length字节,从距离文件开始处偏移量为offset字节的地方开始。start地址仅仅是一个暗示,通常被定义为NULL。自Linux内核2.6开始,在32位系统上,一般是从靠近3GB地址处的用户栈的下方开始往下(低地址)映射。