Stack and Heap
堆的含义
我们都知道malloc
动态申请的变量是存放在堆中. 所以相比栈来说, 堆是动态的.
堆占据进程虚拟地址空间的大部分, 我们可能通过堆来申请1GB
的数组, 但是栈通常不行
, 大多也就几兆的空间.
堆空间的管理
进程中堆空间的管理是运行库
负责的, 在Linux中是GLIBC
.
运行库在初始化时会像操作系统申请一大块的堆空间, 再为每个进行分别分配需求. 当然,
如果某些程序的需求过大, 运行库也可以使用mmap
系统调用直接向操作系统申请, 然后
返回给用户进程.
GLIBC的
malloc
函数的处理方式是: 对于小于128KB
的申请, 会从运行库"批发的"堆空间 里分出一块来; 但若申请的空间过大, 则使用mmap
系统调用来创建匿名空间分配给用户.
Linux中虚拟地址块(VMA)的管理使用了红黑树, 可以用于运行库管理自己向操作系统 “批发"的堆空间. 使得用户程序动态申请和释放内存性能提高.