![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ptmalloc源码分析
文章平均质量分 94
老码农zhuli
自娱自乐的代码人!GIT:https://github.com/zhuli
展开
-
ptmalloc源码分析 - ptmalloc的初始化实现(01)
前几年阅读过华庭的《glibc内存管理ptmalloc源代码分析》文章,并做过一篇笔记今年打算重点阅读一下glibc里面,malloc部分的具体实现机制。ptmalloc简介Linux早期的版本,是由Doug Lea实现的,但是早期的版本有一个问题,就是没办法处理多线程下并发分配和回收的高效和正确性。Wolfram Gloger在Doug Lea的基础上改进使得Glibc的malloc可原创 2020-11-03 16:12:46 · 37960 阅读 · 0 评论 -
ptmalloc源码分析 - 分配区状态机malloc_state(02)
分配器状态机结构malloc_stateptmalloc通过malloc_state的状态机来管理内存的分配。当用户层调用malloc/free等函数的时候,都会通过ptmalloc内核模块进行内存的分配,每一块从操作系统上分配的内存,都会使用malloc_state结构体来管理。/** * 全局malloc状态管理 */struct malloc_state{ /* Serialize access. 同步访问互斥锁 */ __libc_lock_define (, mutex)原创 2020-11-04 14:33:25 · 37973 阅读 · 1 评论 -
ptmalloc源码分析 - 内存组织单元malloc_chunk(03)
上一章讲解了ptmalloc的内存的分配器状态机malloc_state的实现。分配器状态机主要管理内存分配过程中的各种状态以及空闲内存的管理。ptmalloc的最小内存组织单元是chunk的数据结构。通过chunk的数据结构,用于管理每次前端程序使用malloc函数调用所产生的在堆上分配的内存。chunk的数据结构先来看一下chunk的数据结构:mchunk_prev_size:该字段记录物理相邻的前一个chunk的大小(低地址chunk)。如果前一个chunk处于空闲,则该字段记录前一个原创 2020-11-06 17:53:47 · 37681 阅读 · 0 评论 -
ptmalloc源码分析 - 主分配区和非主分配区Arena的实现(04)
这里要注意的是,每次有线程调用分配malloc函数,都会对分配区进行加锁操作,多线程情况下竞争的时候没有获得主分配区的,则去freelist里面去找,找不到则创建一个新的非分配区,如果非分配区都创建满了,则需要等待。当arena满了之后就不再创建而是与其他arena共享一个arena,方法为依次给各个arena上锁(查看是否有其他线程正在使用该arena),如果上锁成功(没有其他线程正在使用),则使用该arena,之后一直使用这个arena,如果无法使用则阻塞等待。二、主分配区和非主分配区的数据结构。原创 2022-11-09 14:15:20 · 37146 阅读 · 2 评论 -
ptmalloc源码分析 - 分配区heap_info结构实现(05)
我们讲解了多线程环境下,面对线程之间的竞争,ptmalloc除了主分配区外,还会去创建非主分配区。因为线程在调用malloc的时候,首先会去获取一个分配区,如果当前的分配区都被锁定并且没有新的分配区可用的时候,ptmalloc就会去创建一个新的。中主要是创建一个新的分配区,该分配区主要是非主分配区类型。主分配区在ptmalloc_init中初始化,并且设置了全局变量main_arena的值。(size_t size, size_t top_pad):创建一个新的非主分配区。一、heap_info是什么?原创 2023-08-29 17:14:03 · 19349 阅读 · 0 评论 -
ptmalloc源码分析 - _int_malloc函数之fastbins(06)
当用户释放一块不大于max_fast(默认值64)的chunk(一般小内存)的时候,会默认会被放到fast bins上。因为fastbinsY是一个数组,数组上挂载malloc_chunk是双向链表,当多线程进行同时操作链表的时候就会冲突,需要进行原子操作。_int_malloc函数中,先看申请的内存大小nb是否符合fast bins的限制,符合的话,首先进入fast bin的分配。内存是如何分配的,以及如何将分配的内存关联到malloc_chunk,然后放置到malloc_state的状态机上,则是由。原创 2023-08-30 15:54:51 · 19251 阅读 · 0 评论 -
ptmalloc源码分析 - _int_malloc函数之smallbins和unsorted bin(07)
前一章,我们讲解了fastbins的空闲链表的分配逻辑。获取得到的victim就是要操作的内存chunk对象,通过chunk2mem和alloc_perturb函数,初始化对象。如果符合smallbin的大小,则从smallbin的数组上获取一个chunk进行内存分配。,则此次分配失败,需要跳出smallbins上的分配逻辑,往下走其他逻辑的分配方式。如果是smallbin,则通过bins的数组下标获取到对应的chunk双向链表。如果,我们分配的是一个small类型的,遇到合适大小的chunk,则可以将。原创 2023-09-08 11:15:18 · 18442 阅读 · 0 评论 -
ptmalloc源码分析 - _int_malloc函数之largebins和Top chunk(08)
下面我们将一下largebins的实现、扫描bins的方法和Top chunk的实现。top chunk相当于分配区的顶部空闲内存,当bins上都不能满足内存分配要求的时候,就会来top chunk上分配。如果上面都没有合适的chunk,则进行bin的扫描进行chunk的内存分配。chunk的大小也是从小到大排列的,所以往后搜索到的chunk的size都要大于分配内存的大小。如果top chunk的大小 大于分配的内存,则将该Top chunk内存切割后直接分配。三、从Top chunk上去分配一块内存。原创 2023-09-12 11:59:50 · 18048 阅读 · 0 评论 -
ptmalloc源码分析 - Top chunk的扩容函数sysmalloc实现(09)
当Top chunk内存空间不足的时候,就会调用sysmalloc函数进行内存分配操作。原创 2023-09-14 15:52:03 · 18364 阅读 · 0 评论 -
ptmalloc源码分析 - free()函数的实现(10)
本章节主要讲解free函数的实现。,该入口函数也在malloc.c的文件中。前几章节我们讲了malloc的具体实现,基本了解了ptmalloc是通过fast bins、unsorted bin、small bin、large bin 和 Top chunk等来管理释放后的内存的。free函数的基本步骤有6步:步骤1:如果是MMAP分配的,则调用munmap_chunk进行chunk的释放操作步骤2:如果释放的内存小于get_max_fast(),则释放的chunk放入fastbin。原创 2023-09-26 15:53:50 · 16780 阅读 · 0 评论 -
ptmalloc源码分析 - realloc()函数的实现(11)
老的chunk内存,大于新分配的,空间足够,则可以进行分割。如果nextchunk不是Top chunk ,并且next为空闲状态,则将nextchunk进行合并。函数,检查bytes是否在分配合法区间内,并且将bytes进行对齐,最终得到对齐的nb大小的内存申请容量。如果 nextchunk 是Topchunk ,并且新的chunk大小大于申请的大小,则直接。,并通过_int_free函数,将裁剪出来的剩余chunk释放到bins上管理。1. _int_realloc函数:老chunk足够大,则裁剪。原创 2023-09-26 22:14:13 · 16731 阅读 · 0 评论 -
ptmalloc源码分析 - malloc/free函数的实战篇(12)
小内存块分配是是落在fastbin上的,这些内存块没有经过合并整理的操作,所以我们可以尝试从已经被free的chunk中获取得到一些信息,例如。我们将malloc_chunk的结构拷贝过来,以及mem2chunk/chunk2men/chunksize等几个宏定义也拷贝过来。如果与top chunk相邻的那个chunk没有回收,将导致top chunk一下很多的空闲内存都无法返回给操作系统。的方式,获取得到chunk的对象指针地址。因为当前chunk在使用中,所以可以获取得到mchunk_size的值了。原创 2023-09-27 11:38:42 · 16707 阅读 · 0 评论