当分配内存小于128k,通过brk()分配,当大于等于128k时通过mmp分配内存
brk()系统调用从堆分配内存
虚拟内存空间中堆区是向高地址增长的,直接将堆顶指针向上移动,
mmap()系统调用从文件映射区分配内存
堆区和栈区中间的未分配空间中还存在一个文件应社区
验证
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
- ps aux 查找进程号
- 进入proc/进程号
- 查看文件maps 查看内存布局信息 通过打印的分配内存首地址和内存布局信息对比看在哪个区
分配内存时会在分配的内存前偏移16字节,记录分配内存的大小,在free的时候能够只提供分配的首地址来释放完整的地址空间
- malloc 通过 brk() 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用;
- malloc 通过 mmap() 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放。