PTMalloc介绍

Glibc一般采用ptmalloc2这个版本去管理内存。进程的内存区域分配如下:

|   Kernel Space             |

|   Undefined Region        |

|   Stack                   |

|    \|/                     |

|   Memory Mapping Region  |

|    /|\                     |

|   Head                    |

|   BSS Segment             |

|   Data Segment            |

|   Text Segment            |

一般对heap的操作提供了两种接口,一是brk()的系统调用,设置了heap的上边界。

对于mmap映射区域提供了mmap()和munmap两种系统调用,因为系统调用的代价很高,用mmap的区域很容易被释放,所以一般小区域的内存用brk申请,大区域的内存用mmap申请;

PtMalloc支持多线程,有一个主分配区域(main arena),有多个非主分配区。某个线程调用malloc时候。会先查看线程私有变量中是否已经存在一个分配区,如果存在则尝试加锁,如果加锁失败则会遍历一遍arena链表试图获取一个没有加锁的arana,如果依然获取不到则创建一个新的分配区(arena)。

PtMalloc的内存管理:

用户请求分配的内存再ptmalloc中使用chunk(组,大块,厚片)表示。每个chunk至少需要8个字节的额外开销。用户free掉的内存不会立马还给操作系统。Ptmalloc会统一管理heap和mmap区域的空闲chunk。避免频繁的系统调用。

Ptmalloc将相似大小的chunk用双向链表连在一起。这样的链表称为一个bin,Ptmalloc一个维护的128个bin,并用数组来维护这些bin。(就像一个hashmap一样,每个数组节点下面都有一个链表,这个链表就是bin)

数组中的第一个称为unsorted bin,数组中从2开始编号的前64个bin称为small bin,同一个small bin中的chunk大小相同。Small bin后面的bin称为large bin。

当释放一个chunk的时候,ptmalloc会检查它前后的chunk有咩有空闲的chunk,有空闲的chunk就会与其合并并且移动到一个bin也就是unsorted bin中,同时也会把

一些小的chunk(小于64b)放到一个fast bins中。

如果fast bins和bins都不能满足需求后,ptmalloc会设法在一个top chunk的空间分配内存,对于非主arena会先通过mmap申请一块大的内存给top chunk。

如果topchunk本身还是不够大, 分配程序会重新mmap分配一块内存chunk,并且将top chunk迁移到新的chunk上,如果free()的chunk刚好与top chunk相邻,那么这两个chunk就会合并成新的topchunk,如果topchunk的大小大于某个阈值,才会还给操作系统。主分配区类似,不过sbrk()的分配和调整topchunk的大小,只有在heap的顶部连续内存空闲超过阈值的时候才会回收内存。

需要的chunk足够大,而且fast bins和bins都不能满足要求,甚至topchunk本身也不能满足分配需求时候,ptmalloc会使用mmao来直接使用内存映射关联到进程空间。

本文通过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、付费专栏及课程。

余额充值