动态存储器分配

在linux c中我们可以使用mmap、munmap函数来创建和删除虚拟存储器区域,大多数c程序还是会在运行时额外虚拟存储器时,使用一种动态存储器分配器。
动态存储器分配器维护着一个进程的虚拟存储器区域称为堆。

用户栈
共享库的存储器映射区域
堆向上 增长
堆(brk指针)
未初始化的数据(.bss)
已初始化的数据(.data)
程序文本(.text)

在linux中,堆是一个请求二进制零的区域,它紧接在未初始化的bss区域后开始,并向上生长。对于每个进程,内核维护着一个指针brk指针,它指向堆的顶部。分配器将堆看作为一组不同大小的块的集合来维护,每个块就是一个连续的虚拟存储器组块(已分配/空闲):

1 已分配块显式的保留供进程使用。
2 空闲块保持空闲知道显式的被分配和使用。

一个已分配块保持已分配状态,知道它被释放。这种释放由进程显示的释放,或分配器自身隐式执行。\
分配器分配方法:
1 显式分配器:要求应用显式地释放任何已分配的块,例:Linux c中采用malloc显式分配内存,通过free显示释放内存。
2 隐式分配器:分配器检测到一个已分配的块长时间没有被程序使用,然后就释放这个块,例:c# 应用程序池回收 垃圾回收机制

相关阅读:
内存映射-mmap函数应用
malloc的使用方法及注意事项
为什么要使用动态存储器分配?