Glibc堆管理机制基础

时间:2021-02-26 12:56:38   收藏:0   阅读:0

最近正在学习linux下堆的管理机制,收集了书籍和网络上的资料,以自己的理解做了整理,做个记录。如果有什么不对的地方欢迎指出!

Memory Allocator

常见的内存管理机制

malloc工作机制

第一次调用malloc

技术图片

内存分配机制

头文件:#include<unistd.h>

  1. 函数原型:int brk(void* end_data_segment)
  2. 功能和作用:用于设置program_break指向的位置。
  1. 函数原型:void* sbrk(intptr_t increment)
  2. 功能和作用:同brk(),参数可以是负数。执行成功返回上一次program_break的值,可以设置参数为0返回当前的program_break.
  1. 功能和作用:当用户申请空间大于等于128kb,也就是0x20000字节时,不再使用brk()进行分配,改为使用mmap()。
  1. 功能和作用:堆mmap()申请的空间进行回收。
    内存分配图

技术图片

第二次调用malloc

chunk

chunk是glibc管理内存的基本单元。主要分为以下几类:

chunk = chunk header + user data,malloc返回给用户的其实是user data指针,具体如下图:

技术图片

alloced chunk结构

技术图片

free chunk

技术图片

top chcunk

技术图片

last remainder chunk

堆空闲块管理结构bin

当alloced chunk被释放后,会根据大小放入bin或者合并到top chunk 中去。bin的主要作用时加快分配速度,通过链表方式(chunk中的fd和bk指针)进行管理。主要有以下几种,顾名思义:

fastbinsY:这是一个bin数组,里面有NFASTBINS个fast bin

bins:也是一个bin数组,一共有126个bin,按顺序分别是:

fast bin

技术图片

unsorted bin

技术图片

small bin

技术图片

large bin

随后附上glibc内存管理流程图

看不清楚可以保存下来放大。
技术图片

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!