Go参考TcMalloc内存分配

news2024/12/30 2:22:21

我发现搞懂 Go 语言内存对象分配,真的没有那么简单。为什么要搞懂 Go 语言的内存分配呢,吃饱了撑的呢!我计划涉猎多些博客,能弥补这块的知识缺失。但也可能中途就放弃了…

下图是截取自 《Go语言变编程入门和实战技巧》的这本书中的示例图,Go 语言使用了类似这样的内存分配实现。TCMalloc 内存管理体系分为三个层次:ThreadCache、CentralCache、PageHeap。采用了三级的内存管理,分配内存和释放内存都从 ThreadCache 开始,向上逐级尝试。

在这里插入图片描述
内存管理的整体思路:首先在 ThreadCache 分配内存,如果内存分配失败,则从下一层的 CentralCache 中补一批上来,还不够的话就再从 PageHeap 申请,再不够就向操作系统申请。释放内存也类似,逐级归还。

这里重点强调一下 ThreadCache 这个对象,很容易让人想到 Go 调度中 M 对象,M 扮演这线程的角色。在 P 对象的机构体中包含一个 mcahce 对象,虽然 mcache 没有声明在 M 结构体中,但 mcache 实际就是图中的 ThreadCache 对象。

再次强调一下 mcache 对象,我们阅读源码库的对 mcache 的注释,关注到三个细节点:小对象、单线程、无锁操作。让我们思路重新回到 TCMalloc 这张图上。

// Per-thread (in Go, per-P) cache for small objects.
// This includes a small object cache and local allocation stats.
// No locking needed because it is per-thread (per-P).
//
// mcaches are allocated from non-GC'd memory, so any heap pointers
// must be specially handled.
//

如果只是看上面那张图,感觉已经把该囊括的都囊括了,但又觉得只是蜻蜓点水。我认真了读了这本书对于 TCMalloc 的解释,每次都感觉是一头雾水。我不觉得作者写的有问题,我感觉自己的理解有问题。

我有查看了 TCMalloc : Thread-Caching Malloc 中对于 TCMalloc 的介绍,和第一张图相比,这张图在介绍的时候,拆成了三个模块:front-end 负责快速分配、回收内存;middle-end 用于补充 front-end 所需内存;back-end 用来从操作系统申请内存。

但是,我们依旧能看到 Per-thread、Center free list、page heap 这几个重复的角色,两者相互佐证一下,TCMalloc 可能真的就是这样子。

在这里插入图片描述

关于这三层结构,我优化要说:确定模块的边界非常重要,不同的模块有明确的不同职责。这样的设计其实非常常见,我们在设计缓存架构时,常见的三层查询:本地内存 -> Redis -> DB,本质上其实差不太多。

下面计划深入一些细节,这里的概念理解也相当重要。TCMalloc 设计了两种内存管理形式,分别是 span 和 object。其中,span 是由一组连续 page 组成的内存块,它由 central 进行管理;object 是将 span 按照特定规格进行切割,固定尺寸的小块内存。

之所以在特别强调一下 object,是因为别把这个 object 理解错了,在这篇文章里,它就描述固定尺寸的小块内存。

接下里,我要开始翻另一篇 TCMalloc : Thread-Caching Malloc 文章,关于小块内存的的申请。ThreadCache 主要负责小块内存的分配,根据需要申请的内存大小计算对应的 size class,然后从对应的 object 链表中获取 object。

如下面这张图所示,每个 size class 都对应了一个 object 链表。如果查找到的 object 链表非空,我们直接移除链表的头结点并返回。如果为空,就向 central free list 申请一批该尺寸的 的 object 加入到链表中,重新执行非空链表的获取逻辑。
在这里插入图片描述
关于提到的 object,该如何在代码中体现出来呢?每个 size class 对应一个 object 链表,类似于一个本地对象池。在这个池子为空的时候,可以申请向池子中添加 object。但是当池子满了的话,后续释放的 object 就无法放回池子,这部分 object 就需要被回收。池子的初始尺寸多大?该如何回收哪些无法放回池子的 object?

我们继续看大对象的申请,这和小对象的申请是明显区分的。针对超出 size class 范围的内存对象,会按照 page 为单位进行申请,如下图所示,它和小对象的 class size 类似,也是从小到大的等级链表。不过,这里的申请逻辑和小对象申请有明显的差异。

比如,我需要申请 3 pages 的内存,但是 3 pages 对应的链表为空,我会继续看 4 pages 是否有可用的内存,直到最终找到一个可以可用的等级内存,假设 4 pages 链表也为空,我最终匹配到了 5 pages 的内存,但我实际值需要 3 pages 的内容,那多出来的 2 pages 会被插入到合适的链表中。

在这里插入图片描述
因为申请到更大的尺寸,而多出来的 pages,是如何分配插入其他合适链表的呢?这个也很重要,比如上面多出来的 2 pages,是插入到 2pages 对应的链表呢?还是拆分成 2 个独立的 page,插入到 1page 对应的链表?万一1 page 和 2 pages 对应的链表非空元素特别多怎么办?

CentralCache 属于 ThreadCache 和 PageHeap 的中间人,负责将 PageHeap 中的内存切成小块,在恰当的时机分配给 ThreadCacche。在释放内存方面,CentralFreeList 获取从 ThreadCache 中回收的内存并在恰当的时机归还给 PageHeap。

ThreadCache 属于线程管理的内存,对象所需的内存申请在线程内部完成,不涉及到加锁的开销,主要负责小对象的内存分配。PageHeap 属于中央堆分配器,被所有线程共享,分享时需要加锁,负责与操作系统直接交互,并且大尺寸的内存申请直接通过 PageHeap 进行分配。

关于 span 和 class 的概念,内存的最小单位是 page,而 span 用来对 page 做管理,不同类型的 span 由不同数量的 page 组成,下图中,span A 由 2 个page 组成,span B 由 3 个 page 组成。这是一个对象关系的层次结构,用来记录 object 最终分配的内存位置。

关于 span 还是

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业选择中端CRM系统应看中哪四方面?

中端市场做得更好的CRM系统是哪家?有咨询公司针对企业用户进行了调研,评估得出——在中端市场,CRM操作简单、开箱即用、学习难度低,加快了实施进度,降低使用成本。 CRM系统适合中端市场的四方面: 1、性价比…

【Python+selenium】生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导入HTMLT…

探索TikTok本土MCN,怎么入驻呢?

探索TikTok本土MCN:崛起的新媒体力量 引言: 随着社交媒体的快速发展,TikTok作为一款全球热门的短视频应用,吸引了数以亿计的用户。在这个平台上,用户可以通过创作有趣、创新的短视频内容来吸引关注和粉丝。而在TikTo…

J. 二进制与、平方和

Problem - J - Codeforces 思路:因为与操作是按位进行的,我们可以考虑拆开每一位,并且我们发现了一个性质,如果x的某一位是1,那么x对这一位是无影响的,因为任何数与1都是它本身,所以对于x的二进…

【逻辑回归实例】

逻辑回归:从理论到实践 在本文中,我们将介绍一种被广泛用于二分类问题的机器学习模型——逻辑回归。我们将通过一个实例,深入解析如何在 Python 环境中实现逻辑回归。 源数据下载链接 1. 什么是逻辑回归? 逻辑回归是一种用于解…

一次零基础靶机渗透细节全程记录

一、打靶总流程 1.确定目标: 在本靶场中,确定目标就是使用nmap进行ip扫描,确定ip即为目标,只是针对此靶场而言。其他实战中确定目标的方式包括nmap进行扫描,但不局限于这个nmap。 2.信息收集: 比如平常挖…

园区预付费远程抄表方案

园区预付费远程抄表方案是一种能够实现园区内电表数据远程采集、实时监控和预付费管理的方案。该方案解决了传统手动抄表方式的不便和不准确问题,同时避免了上门收费的安全隐患和成本问题。下面将从方案组成、工作原理、优点等方面进行详细介绍。 一、方案组成 园区…

P1095 [NOIP2007 普及组] 守望者的逃离

总的来说就是能闪则闪&#xff0c;闪烁在能闪时一定比跑的快&#xff1b;分批进行&#xff0c;判断哪个更快&#xff1b; 直接上代码吧&#xff0c;里面有注释&#xff0c; #include <iostream>using namespace std;const int N 3e5 5; int M, S, T, blue[N], dp[N];…

selenium自动化测试的显示等待

目录 等待条件 条件类的实现原理 WebDriverWait是如何进行条件判断的 selenium里都有哪些条件 然后就是自定义了 总结&#xff1a; 在进行UI自动化测试的时候&#xff0c;我们为了保持用例的稳定性&#xff0c;往往要设置显示等待&#xff0c;显示等待就是说明确的要等到某…

Java中的IO流详解

目录 友情提醒第一章、File类和IO技术概述1.1&#xff09;File类和IO技术的作用1.2&#xff09;创建File类对象1.3&#xff09;File类中的方法1.4&#xff09;文件过滤器&#xff1a;FileFileter 第二章、IO流2.1&#xff09;IO流的分类2.2&#xff09;字节输入流&#xff1a;I…

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA 1.背景介绍2.数学模型3.文件结构4.算法流程图5.伪代码6.详细代码及注释6.1 AVOA.m6.2 boundaryCheck.m6.3 exploitation.m6.4 exploration.m6.5 initialization.m6.6 levyFlight.m6.7 main.m6.8 ObjectiveFunction.m6.9 random_se…

ARPACK特征值求解分析

线性方程组求解、特征值问题是数值线性代数的主要研究内容。力学、电磁等许多问题&#xff0c;最终都可以归结为特征值、特征向量的求解。 ARPACK使用IRAM(Implicit Restarted Arnoldi Method)求解大规模系数矩阵的部分特征值与特征向量。了解或者熟悉IRAM算法&#xff0c;必定…

S32K flash擦除异常以及flash保护 (FLASH_DRV_CommandSequence函数异常)

出现问题 出现擦除flash异常,一直在FLASH_DRV_CommandSequence卡死复位 但是出现比较奇怪的现象&#xff0c;通过DEBUG在线调试&#xff0c;打断点&#xff0c;一步一步调试可以正常对flash正常擦除读写&#xff0c;但是脱离在线调试就出现不能正常擦除读写。 出现这种还是看…

大模型基础之大语言模型的进展

关键字&#xff1a;LLM大语言模型&#xff0c;fine-tuning微调 预训练语言模型的两种范式 1 特征提取器 提取语言的特征和表示&#xff0c;作为下游模型的输入。例如有名的word2vec模型。 use the output of PLMs as the input of downstream model 2 fine-tuning&#xf…

【代码随想录 | Leetcode | 第一天】数组 | 二分查找 | 边界问题 | 34-35-69-367-704

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来二分查找边界问题&#xff08;循环不变量规则&#xff09;的分享✨ 目录 前言704. 二分查找367. 有效的完全平方数69. x 的平方根35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位…

PN结、形成过程、单向导电性、伏安特性、电容效应

目录 1.1.3PN结 PN结形成过程&#xff1a; PN结的单向导电性&#xff1a; PN结的伏安特性 PN结的电容效应 1.1.3PN结 形成&#xff1a;由于扩散运动而形成 扩散运动&#xff1a;物质总是从浓度高的地方向浓度低的地方运动&#xff0c;这种由于浓度差而产生的运动称为扩散运…

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

ubuntu20.04配置vscode

下载&#xff1a; https://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.debhttps://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.deb 安装&#xff1a…

MySQL基础篇第9章(子查询)

文章目录 1、需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2、单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.6 非法使用子查询 3、多行子查询3.1 多行比较操作符3.2 代码示例3.3 空值问题…

vuepress - - - 首页底部版权信息加a标签超链接跳转或备案信息跳转链接

修改前 默认的底部版权信息只能填写纯文本&#xff0c;加不了超链接跳转等。 对应\docs\README.md内容&#xff1a; 修改后 修改后&#xff0c;点击Zichen跳转会打开新的网页。 看官网例子 底部添加了备案号跳转链接。 找到官网的github部署的文件。点导航栏中的“指…