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_nextsi

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值