malloc底层工作原理——ptmalloc

本文深入剖析了ptmalloc内存管理机制,包括边界标志法如何标识chunk状态,以及分箱式内存管理如何通过fast bins、unsorted bin、small bins和large bins高效管理空闲内存。malloc()和free()的底层实现,如快速分配、合并chunk、内存查找等步骤也被详细阐述。此外,介绍了分配区和top chunk的概念,强调了多线程环境下内存分配的优化策略。
摘要由CSDN通过智能技术生成

概述

本文主要分析ptmalloc中的对于每个内存块的管理方法:边界标志法和所有内存块的整体管理:分箱式内存管理。以及malloc()函数和free()函数的底层原理和工作步骤。


边界标志法

ptmalloc使用chunk实现内存管理,不管内存是在哪里被分配的,用什么方法分配,用户请求分配的空间在ptmalloc中都使用一个chunk来表示。用户调用free()函数释放掉的内存也并不是立即归还给操作系统,它们也会被表示为一个chunk,一个使用中的chunk在内存中的样子如图:

chunk指针指向一个chunk的开始,一个chunk中包含了用户请求的内存区域和相关的控制信息。图中的mem指针才是真正返回给用户的内存指针。P表示前一个块是否在使用中,为0时表示前一个chunk空闲,这时chunk的第一个域prev_size才有效,prev_size表示前一个chunk的大小,程序可以使用这个值来找到前一个chunk的开始地址。当P为1时表示前一个chunk在使用中,prev_size无效,也就无法得到前一个chunk的大小。不能对其进行操作,ptmalloc分配的第一个块总是将P设为1.以防止程序引用到不存在的区域。M表示当前chunk是从哪个区域获得的虚拟内存,为1时表示是从mmap映射区分配的,否则是从heap区分配的。A表示该chunk属于主分配区或者非主分配区,1表示非主分配区,0表示主分配区。

空闲chunk在内存中的结构如图所示:

当chunk空闲时,其M状态不存在,只有AP状态,原本是用户数据区的地方存储了四个指针,指针fd指向后一个空闲chunk,而bk指向前一个空闲的chunk,fd_nextsize和bk_nextsize用于加快在large bin中查找最近匹配的空闲chunk。

chunk在ptmalloc源码中使用结构体malloc_chunk来描述,malloc_chunk定义如下:

struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* 前一个chunk的大小(只当其空闲时有效) */
INTERNAL_SIZE_T size; /* 当前chunk的大小 */
struct malloc_chunk* fd; /* 后一个空闲的chunk,仅当前chunk空闲时有效 */
struct malloc_chunk* bk; /* 前一个空闲的chunk,仅当前chunk空闲时有效 */

struct malloc_chunk* fd_nextsize; 
struct malloc_chunk* bk_nextsize;
};

fd_nextsize和bk_nextsize的含义:当当前的chunk存在于large bins中时,large bins中的空闲chunk是按照大小排序的,但相同大小的chunk可能有多个,增加了这两个字段可以加快遍历空闲chunk,并查找满足需要的空闲chunk。fd_nextsize指向下一个比当前chunk大小大的第一个空闲chunk,bk_nextsize指向前一个比当前chunk大小小的第一个空闲chunk。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值