malloc原理分析:ptmalloc2


glibc中malloc采用的是ptmalloc2内存池管理方式,使用边界标记法将内存划分成很多块,从而对内存的分配与回收进行管理。

多线程:主分配区和非主分配区

为了支持多线程,ptmalloc使用两类分配区:主分配区main_area和非主分配区no_main_area。

  • 主分配区和非主分配区形成一个环形链表进行管理。
  • 每一个分配区利用互斥锁使线程对于该分配区的访问互斥。
  • 每个进程只有一个主分配区,可以有多个非主分配区。

当一个线程需要使用malloc分配内存的时候,会先查看该线程的私有变量中是否已经存在一个分配区。若存在,会尝试对其进行加锁操作。若是加锁成功,就在使用该分配区分配内存,若是失败,就会遍历循环链表中获取一个未加锁的分配区。若是整个链表中都没有未加锁的分配区,则malloc会开辟一个新的分配区,将其加入全局的循环链表并加锁,然后使用该分配区进行内存分配。当释放这块内存时,同样会先获取待释放内存块所在的分配区的锁。若是有其他线程正在使用该分配区,则必须等待其他线程释放该分配区互斥锁之后才能进行释放内存的操作。

结构

chunk

ptmalloc使用chunk结构体描述内存块,内部包含大小、前后chunk指针、前一个 chunk 是否在使用中、前一个 chunk 的大小等成员。
在这里插入图片描述

  • p主要用于内存块的合并操作;
    • p=0时,表示前一个chunk为空闲,prev_size才有效;
    • p=1时,表示前一个chunk正在使用,prev_size无效
    • ptmalloc 分配的第一个块总是将p设为1, 以防止程序引用到不存在的区域
  • M=1 为mmap映射区域分配,M=0为heap区域分配
  • A=0 为主分配区分配,A=1 为非主分配区分配。

空闲chunk在内存中的结构:

在这里插入图片描述

  • fp和bp分别指向前一个和后一个空闲链表上的chunk
  • fp_nextsize和bp_nextsize分别指向前一个空闲chunk和后一个空闲chunk的大小,主要用于在空闲链表上快速查找合适大小的chunk。
  • fp、bp、fp_nextsize、bp_nextsize的值都会存在原本的用户区域,这样就不需要专门为每个chunk准备单独的内存存储指针了。

bin

相似大小的chunk在free后被malloc用双向链表链接起来,这样一个链表被称为一个bin,一共有128个bin。基于chunk的大小,bin一共有四种:

  1. Fast bin ( < 64B )
  2. Unsorted bin
  3. Small bin
  4. Large bin

这些bins被保存在数组fastbinsY(fast bin)和bins(其他bin)中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值