028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

探秘LinuxC++程序内存管理--ptmalloc-创新互联

一、概述

ptmalloc 是开源 GNU C Library (glibc) 默认的内存管理器,当前大部分 Linux 服务端程序使用的是 ptmalloc 提供的 malloc/free 系列函数,而它在性能上远差于 Meta 的 jemalloc 和 Google 的 tcmalloc。服务端程序调用 ptmalloc 提供的 malloc/free 函数申请和释放内存,ptmalloc 提供对内存的集中管理,以尽可能达到:

十余年的平罗网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整平罗建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“平罗网站设计”,“平罗网站推广”以来,每个客户项目都认真落实执行。

简单概括 ptmalloc 的内存管理策略:

接下来,将从 ptmalloc 数据结构、内存分配及优缺点介绍最经典的 c++ 内存管理器的实现和使用(以 32 位机为例)。

二、内存管理 2.1 数据结构

为了解决多线程锁争夺问题,将内存分配区分为主分配区 (main_area) 和非主分配区 (no_main_area)。同时,为了便于管理内存,对预申请的内存采用边界标记法划分成很多块 (chunk);ptmalloc 内存分配器中,malloc_chunk 是基本组织单元,用于管理不同类型的 chunk,功能和大小相近的 chunk 串联成链表,被称为一个 bin。

main_arena 与 non_main_arena

主分配区和非主分配区形成一个环形链表进行管理, 每一个分配区利用互斥锁实现线程对该分配区的访问互斥。每个进程只有一个主分配区,但允许有多个非主分配区,且非主分配区的数量只增加不减少。主分配区可以访问进程的 heap 区域和 mmap 映射区域,即主分配区可以使用 sbrk () 和 mmap () 分配内存;非主分配区只能使用 mmap () 分配内存。

对于不同 arena 的管理策略大致如下:

主分配区和非主分配区的结构如下:

其中 fastbinsY 和 bins 是对实际内存块的管理和操作结构:

malloc_chunk 与 bins

ptmalloc 统一管理 heap 和 mmap 映射区域中空闲的 chunk,当用户进行分配请求时,会先试图在空闲的 chunk 中查找和分割,从而避免频繁的系统调用,降低内存分配的开销。为了更好的管理和查找空闲 chunk,在预分配的空间的前后添加了必要的控制信息,内存管理结构 malloc_chunk 的成员及作用如下:

基于 chunk 的大小和使用方法,划分出以下几种 bins:

当然,并不是所有 chunk 都按上述的方式来组织,其他常用的 chunk,如:

2.2 内存分配与释放

概括内存 malloc 和 free 的流程大致如下:

内存分配 malloc 流程

1、获取分配区的锁

2、计算出需要分配的内存的 chunk 实际大小

3、如果 chunk 的大小< max_fast,在 fast bins 上查找适合的 chunk;如果不存在,转到 5

4、如果 chunk 大小< 512B,从 small bins 上去查找 chunk,如果存在,分配结束

5、需要分配的是一块大的内存,或者 small bins 中找不到 chunk:

6、需要分配的是一块大的内存,或者 small bins 和 unsorted bin 中都找不到合适的 chunk,且 fast bins 和 unsorted bin 中所有的 chunk 已清除:

7、检索 fast bins 和 bins 没有找到合适的 chunk,判断 top chunk 大小是否满足所需 chunk 的大小,从 top chunk 中分配

8、top chunk 不能满足需求,需要扩大 top chunk:

内存释放 free 流程

1、获取分配区的锁

2、如果 free 的是空指针,返回

3、如果当前 chunk 是 mmap 映射区域映射的内存,调用 munmap () 释放内存

4、如果 chunk 与 top chunk 相邻,直接与 top chunk 合并,转到 8

5、如果 chunk 的大小 >max_fast,放入 unsorted bin,并且检查是否有合并:

6、如果 chunk 的大小< max_fast,放入 fast bin,并且检查是否有合并:

7、在 fast bin,如果相邻 chunk 空闲,则将这两个 chunk 合并,放入 unsorted bin。如果合并后的大小 >64KB,会触发进行 fast bins 的合并操作,fast bins 中的 chunk 将被遍历合并,合并后的 chunk 会被放到 unsorted bin 中。合并后的 chunk 和 top chunk 相邻,则会合并到 top chunk 中,转到 8

8、如果 top chunk 的大小 >mmap 收缩阈值(默认为 128KB),对于主分配区,会试图归还 top chunk 中的一部分给操作系统

三、优缺点

ptmalloc 作为 glibc 默认的内存管理器,已经广泛的满足大多数大型项目的内存管理,同时它的实现思路也对后来的内存管理器提供了借鉴。

ptmalloc 的介绍暂告一段落,接下来的几篇文章将继续探讨高性能内存管理库的集大成者 ——jemalloc、tcmalloc 内存管理库。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:探秘LinuxC++程序内存管理--ptmalloc-创新互联
分享URL:http://www.tsicrk.com/article/dsijgh.html

其他资讯

让你的专属顾问为你服务

0.8773s