提供两种堆空间的分配方式,即两个系统调用:一个是 brk()
系统调用,另一个是 mmap()
brk
的作用是设置进程数据段的结束地址,可以扩大或者缩小数据段,sbrk
类似,不过参数和返回值都是增量
mmap
的作用和 Windows 下 VirtualAlloc
相似,它的作用就是向操作系统申请一段虚拟空间,当它不将地址空间映射到某一个文件的时候,我们又称这块空间为匿名空间(Anonymous),匿名空间可以拿来作为堆空间
mmap
的前两个参数分别用于指定需要申请的起始地址和长度,如果起始地址设置为 0,那么 Linux 会贴心的自动挑选一个格式的起始地址,后面的参数都是设置空间权限或者映射类型或者文件映射的东西,不要在意
glibc 的 malloc 是这么处理用户的空间请求的:对于 128KB 以下的请求直接在现有的堆空间里面按照堆分配算法来给它分配一块匿名空间,如果是大于则用 mmap 申请一个匿名空间,在这个匿名空间中为用户分配空间