Stack and Heap

 

堆的含义

我们都知道malloc动态申请的变量是存放在堆中. 所以相比栈来说, 堆是动态的.

堆占据进程虚拟地址空间的大部分, 我们可能通过堆来申请1GB的数组, 但是栈通常不行 , 大多也就几兆的空间.

 

堆空间的管理

进程中堆空间的管理是运行库负责的, 在Linux中是GLIBC.

运行库在初始化时会像操作系统申请一大块的堆空间, 再为每个进行分别分配需求. 当然, 如果某些程序的需求过大, 运行库也可以使用mmap系统调用直接向操作系统申请, 然后 返回给用户进程.

GLIBC的malloc函数的处理方式是: 对于小于128KB的申请, 会从运行库"批发的"堆空间 里分出一块来; 但若申请的空间过大, 则使用mmap系统调用来创建匿名空间分配给用户.

Linux中虚拟地址块(VMA)的管理使用了红黑树, 可以用于运行库管理自己向操作系统 “批发"的堆空间. 使得用户程序动态申请和释放内存性能提高.


创建于: 2022-06-28T16:41:54, Lastmod: 2023-09-24T18:08:59