一、堆内存分配
进程在运行期间可以通过增加堆(heap)的大小来为进程分配内存,在进程的内存布局中,堆是一段大小可变的连续虚拟内存,始于BSS段的末尾,随着内存的分配和释放而增减。和栈有自己的指针指向栈顶一样,堆也有指向堆边界的“program break”。
1.调整program break:brk()和sbrk()
改变堆的大小(即分配或释放内存),其实就像命令内核改变program break位置一样简单,最初,program break与BSS段末尾重合,在program break抬升后,程序可以访问新增内存的任何地址,而此时物理内存页尚未分配,在首次访问该内存时,引发页面错误后会自动分配内存物理页。
这里有个问题,上面为什么没有说是调用malloc函数后program break抬升呢?因为,malloc调用后,program break不一定改变,这个就要从malloc和free说起,因为free掉一块内存时,内核大多时候会将其保存在一个空闲内存列表中,后续再有malloc来申请内存,先看空闲内存列表中有没有满足的内存,如果有就直接分出去,如果没有,就在去堆新申请,然后program break就改变了。
两个操纵program break的系统调用: