ptmalloc代码浅析2(small bin/large bin结构图)

ptmalloc中的small bin和large bin维护着不同结构的chunk链表:
1. 每个small bin维护着一个双向循环链表,而且chunk size都相同。当allocate memory时,总是从链表尾端unlink一个chunk,deallocate memory时,将那个chunk link到链表头。属于FILO规则,每个chunk都有机会被分配到app。



2. 每个large bin维护着两种链表,一种是横向的双向循环链表,类似于small bin中的链表,唯一不同的是large bin中的chunk size是从大到小有序的,另一种是纵向的双向链表。在横向链表中,每个chunk作为纵向双向链表的头。各个纵向链表中chunk size相同。



a) 在上面的结构图中,横向的循环双向链表是以fd_nextsize和bk_nextsize域串接起来,而纵向的双向链表是以fd和bk域串接起来的。图中横向链表也叫做chunk size链表,最大chunk的bk_nextsize域指向最小size的chunk,反过来最小size的chunk的fd_nextsize域指向最大size的chunk。

b) 当有chunk要放入到某个large bin的链表中时,首先以chunk size从到小到大的,按照bk_nextsize的顺序来查找合适的插入位置(找到第一个chunk size大于等于这个chunk的size的纵向chunk链表),如果碰到相同chunk size的chunk纵向链表,则将这个chunk插入到纵向链表的第二个位置(这样是为了不进行额外的fd_nextsize/bk_nextsize赋值操作),否则将这个chunk作为独立的纵向chunk链表,插入到chunk size链表中。


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文通过Glibc的内存暴增问题,主要介绍了系统的内存管理问题,具体如下: 目录 1. 问题 2. 基础知识 2.1 X86平台Linux进程内存布局 2.1.1 32位模式下进程内存经典布局 2.1.2 32位模式下进程默认内存布局 2.1.3 64位模式下进程内存布局 2.2 操作系统内存分配的相关函数 2.2.1 Heap操作相关函数 2.2.2 Mmap映射区域操作相关函数 3. 概述 3.1 内存管理一般性描述 3.1.1 内存管理的方法 3.1.2 内存管理器的设计目标 3.1.3 常见C内存管理程序 3.2 Ptmalloc内存管理概述 3.2.1 简介 3.2.2 内存管理的设计假设 3.2.3 内存管理数据结构概述 3.2.4 内存分配概述 3.2.5 内存回收概述 3.2.6 配置选项概述 3.2.7 使用注意事项 4. 问题分析及解决 5. 源代码分析 5.1 边界标记法 5.2 分箱式内存管理 5.2.1 Small bins 5.2.2 Large bins 5.2.3 Unsorted bin 5.2.4 Fast bins 5.3 核心结构体分析 5.3.1 malloc_state 5.3.2 Malloc_par 5.3.3 分配区的初始化 5.4 配置选项 5.5 Ptmalloc的初始化 5.5.1 Ptmalloc未初始化时分配/释放内存 5.5.2 ptmalloc_init()函数 5.5.3 ptmalloc_lock_all(),ptmalloc_unlock_all(),ptmalloc_unlock_all2() 5.6 多分配区支持 5.6.1 Heap_info 5.6.2 获取分配区 5.6.3 Arena_get2() 5.6.4 _int_new_arena() 5.6.5 New_heap() 5.6.6 get_free_list()和reused_arena() 5.6.7 grow_heap(),shrink_heap(),delete_heap(),heap_trim() 5.7 内存分配malloc 5.7.1 public_mALLOc() 5.7.2 _int_malloc() 5.8 内存释放free 5.8.1 Public_fREe() 5.8.2 _int_free() 5.8.3 sYSTRIm()和munmap_chunk(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值