当前位置: 首页 > news >正文

内存分配器性能优化

背景

在之前我们提到采用自定义的内存分配器来解决防止频繁 make 导致的 gc 问题。gc 问题本质上是 CPU 消耗,而内存分配器本身如果产生了大量的 CPU 消耗那就得不偿失。经过测试初代内存分配器实现过于简单,产生了很多 CPU 消耗,因此必须优化内存分配器的性能。

性能消耗原因

在内存的分配和回收上,使用了简单的循环检测,当内存碎片较多的时候,循环消耗非常可观

查找可分配的内存

在这里插入图片描述

找到回收的内存偏移

在这里插入图片描述

性能优化

很快在社区中大家给出了一个称为 Buddy 的内存分片算法,那么这个算法是否能解决问题呢?

Buddy 算法

这是一个非常高效的算法,采用的是满二叉树数据结构,用一个数组来表示,然而当实际使用时却遇到了问题,因为我需要在自研的 BufReader 中使用,因此不能出现内存缝隙。Buffdy 算法在回收内存时只能按照申请什么回收什么的原则。举例,我申请了一个var a []byte = alloc(100),那么回收必须也是回收 free(a)。而自研的 BufReader,需要“部分回收”能力。比如先回收a[50:],然后再回收a[:50]。那么 Buddy 算法将无能为力。
在这里插入图片描述

当然,这个算法最终还会用到,这里先留个悬念。

双圣树模型

这是我自己起的名字,实际上是利用两颗平衡二叉树来实现快速找到可分配的内存以及快速回收内存。

type	Allocator struct {pool       []*BlocksizeTree   *BlockoffsetTree *BlockSize       int// history    []History}

分配树

这颗树,用来快速查找可分配的内存,我们将可分配的内存用一个节点表示

type	Block struct {Start, End inttrees      [2]Tree}

sizeTree 通过对每个节点的大小(End-Start)进行排序,在分配时,通过查找树中刚好大于等于待分配大小的节点,再修改这个节点,对树进行平衡即可。

回收树

这颗树,用来找到回收内存块前后的 Block,通过合并或者插入 Block 达到回收内存的效果。

合并前面合并后面合并前后仅插入
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

共享节点

由于两棵树只是表达了不同的排序,里面所有节点的数量和属性都是相同的,因此不需要两套节点,只需要公用一套节点集合即可。

type Tree struct {left, right *Blockheight      int}

每个节点有两套指针,分别指向两棵树的不同的子节点,从而在逻辑上形成了两棵树。

进阶优化

虽然我们最终通过双圣树模型,实现了内存分配器的性能优化,但是优化并没有因此而停止。因为上述的内存分配器是无锁的,只适合给单个 goroutine 使用,如果加锁则性能大打折扣。
那么从宏观角度来说,分配器持有的大内存块也会存在需要回收的情况。比如在流销毁的时候。

再次使用 Buddy 算法

这时候大内存块就不需要部分回收了,此时就又可以采用 Buddy 算法了。我们只需要在申请大内存块时,按照 2 倍数来申请,可以最大化利用。最终我们形成了两级内存分配。当然在这里就需要用锁了。
在这里插入图片描述

相关文章:

内存分配器性能优化

背景 在之前我们提到采用自定义的内存分配器来解决防止频繁 make 导致的 gc 问题。gc 问题本质上是 CPU 消耗,而内存分配器本身如果产生了大量的 CPU 消耗那就得不偿失。经过测试初代内存分配器实现过于简单,产生了很多 CPU 消耗,因此必须优…...

《OKR工作法》读书笔记

花了两个晚上的时间看完了《OKR工作法》这本书,谈不上有什么感想,因为工作后,其实就一直在用这种方法,所谓当局者迷嘛,习以为常也就谈不上多少新的启发。所以,这篇文章纯粹是一篇读书笔记,把我认…...

2025年计算机毕业设计题目参考-简单容易

2025年最新计算机毕业设计题目参考-第二批 以下可以参考 企业员工薪酬关系系统的设计 基于SpringBoot在线远程考试系统 SpringBootVue的乡政府管理系统 springboot青年公寓服务平台 springboot大学生就业需求分析系统 基于Spring Boot的疗养院管理系统 基于SpringBoot的房屋交…...

3.8. 马氏链-一般状态空间的马氏链(Harris链)

一般状态空间的马氏链-Harris链 1. Harris链及示例1.1. Harris链1.2. 示例2. 修改的Harris链( X ˉ n \bar{X}_{n} Xˉn​)2.1. 修改的Harris链( X ˉ n \bar{X}_{n} Xˉn​)2.2. 三个引理(可以从 X ˉ n \bar{X}_{n} Xˉn​的结论推出 X n X_{n} Xn​的结论)3. 推广相关…...

Python8 使用结巴(jieba)分词并展示词云

Python的结巴(jieba)库是一个中文分词工具,主要用于对中文文本进行分词处理。它可以将输入的中文文本切分成一个个独立的词语,为后续的文本处理、分析、挖掘等任务提供基础支持。结巴库具有以下功能和特点: 中文分词&a…...

python中scrapy

安装环境 pip install scrapy 发现Twisted版本不匹配 卸载pip uninstall Twisted 安装 pip install Twisted22.10.0 新建scrapy项目 scrapy startproject 项目名 注意:项目名称不允许使用数字开头,也不能包含中文 eg: scrapy startproject scrapy_baidu_…...

基础语法总结 —— Python篇

1、环境搭建 建议直接安装 PyCharm (Community Edition) Python3.x版本,前者是一个很好用的编译器,后者是Python的运行环境之类的,安装参考https://mp.csdn.net/mp_blog/creation/editor/139511640 2、标识符 第一个…...

数据库系统概述选择简答概念复习

目录 一、组成数据库的三要素 二、关系数据库特点 三、三级模式、二级映像 四、视图和审计提供的安全性 审计(Auditing) 视图(Views) 五、grant、revoke GRANT REVOKE 六、三种完整性 实体完整性 参照完整性 自定义完整性 七、事务的特性ACDI 原子性(Atomicity)…...

template标签

在HTML中&#xff0c;<template> 标签是一个用于封装可重用内容的非显式元素。它不直接显示在网页上&#xff0c;而是作为一个模板&#xff0c;用来定义一组HTML结构和样式&#xff0c;可以在JavaScript中实例化多次&#xff0c;动态地插入到文档的不同位置。这在创建复杂…...

WPF 程序 分布式 自动更新 登录 打包

服务器server端 core api 客户端WPF // 检查应用更新 //1、获取最新文件列表 // var files fileService.GetUpgradeFiles(); // 2、文件判断&#xff0c;新增的直接下载&#xff1b;更新的直接下载&#xff1b;删除的直接删除 // 客户端本地需要一个记录…...

视频汇聚安防综合管理平台EasyCVR支持GA/T 1400视图库标准及设备接入配置

一、概述 视频汇聚安防综合管理平台EasyCVR视频监控系统已经与公安部GA/T 1400视图库标准协议实现了对接&#xff0c;即《公安视频图像信息应用系统》。 安防监控系统EasyCVR支持采用GA/T 1400进行对接&#xff0c;可实现人脸数据使用的标准化、合规化。其采用统一接口对接雪…...

pgsql给单独数据库制定账号权限

登录到PostgreSQL: 使用psql或其他PostgreSQL客户端&#xff0c;以具有足够权限的账号&#xff08;如postgres或superuser&#xff09;登录。 2. 创建新账号: sql复制代码 CREATE USER new_user WITH PASSWORD your_secure_password; 注意&#xff1a;将your_secure_passwor…...

【Docker安装】Ubuntu系统下部署Docker环境

【Docker安装】Ubuntu系统下部署Docker环境 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、部署Docker环境4.1 安装Docker4.2 检查Docker版本4.3 配置Docker镜像加速4.4 启动Doc…...

Flink Kafka获取数据写入到MongoDB中 样例

简述 Apache Flink 是一个流处理和批处理的开源框架&#xff0c;它允许从各种数据源&#xff08;如 Kafka&#xff09;读取数据&#xff0c;处理数据&#xff0c;然后将数据写入到不同的目标系统&#xff08;如 MongoDB&#xff09;。以下是一个简化的流程&#xff0c;描述如何…...

Android Jetpack Compose入门教程(二)

一、列表和动画 列表和动画在应用内随处可见。在本课中&#xff0c;您将学习如何利用 Compose 轻松创建列表并添加有趣的动画效果。 1、创建消息列表 只包含一条消息的聊天略显孤单&#xff0c;因此我们将更改对话&#xff0c;使其包含多条消息。您需要创建一个可显示多条消…...

如何避免接口重复请求(axios推荐使用AbortController)

前言&#xff1a; 我们日常开发中&#xff0c;经常会遇到点击一个按钮或者进行搜索时&#xff0c;请求接口的需求。 如果我们不做优化&#xff0c;连续点击按钮或者进行搜索&#xff0c;接口会重复请求。 以axios为例&#xff0c;我们一般以以下几种方法为主&#xff1a; 1…...

算法设计与分析:网络流求解棒球赛淘汰问题C++

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想 1、明显的:win[i]+remain[i][j]<> 2、不明显的:最大流 3、操作 3.1 先读入相关信息(邻接矩阵**k),进行一遍“明显的”判断。 3.2 对剩下的“不明显的”的每个球队构建流网络(邻接表vector< ve…...

Linux Ubuntu 24.04 C语言gcc编译过程详解

下面是Hello World程序源代码文件hello.c的内容&#xff0c;我们将以它为例来说明源文件到可执行文件的形成过程&#xff0c;主要分4步&#xff1a;预处理、汇编、机器码、链接。 #include <stdio.h> int main () {printf ( "hello, world \n " );return 0; }…...

Python自动化办公篇—pandas操作Excel:读取+查看+选择+清洗+排序+筛选+函数+写入

目录 专栏导读库的介绍库的安装1、读取数据2、查看数据3、选择数据4、数据清洗5、数据排序6、数据筛选7、数据操作8、数据写入总结 专栏导读 文章名称链接Python自动化办公—pyautogui图像定位\点击功能,实现自动截取当前屏幕并检索点击(可制作为游戏点击脚本)点我进行跳转Pyt…...

数据库大作业——音乐平台数据库管理系统

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; 《数据库系统》课程设计 &#xff1a;流行音乐管理平台数据库系统&#xff08;本数据库大作业使用软件sql server、dreamweaver、power designer&#xff09; 目录 系统需求设计 数据库概念结构设计 实体分析 属性分…...

Panda-AGI开源框架:构建具备长期记忆与规划能力的AI智能体

1. 项目概述&#xff1a;当“熊猫”遇上AGI&#xff0c;一个开源智能体的新范式最近在开源社区里&#xff0c;一个名为sinaptik-ai/panda-agi的项目引起了我的注意。光看名字就很有意思&#xff0c;“Panda”和“AGI”&#xff08;Artificial General Intelligence&#xff0c;…...

开发者会话管理工具:提升多任务开发效率的利器

1. 项目概述&#xff1a;一个为开发者打造的会话管理利器在开发日常中&#xff0c;我们常常会同时打开多个终端窗口、IDE项目、数据库连接或者远程服务器会话。一天下来&#xff0c;桌面上可能散落着十几个终端标签页&#xff0c;每个都承载着不同的上下文&#xff1a;一个在跑…...

Swift集成飞书生态:使用feishu-swift SDK实现高效开发

1. 项目概述&#xff1a;一个连接飞书与Swift生态的桥梁最近在折腾一个内部工具&#xff0c;需要把iOS App里的某些数据自动同步到飞书文档里&#xff0c;方便团队协作查看。一开始想用飞书官方API直接写&#xff0c;但发现Swift这边原生的HTTP请求和JSON处理起来有点啰嗦&…...

微软 Qlib 实战:从零构建跑赢大盘的 AI 智能选股策略(附最新回测与全流程代码)

在 GitHub 的量化投资社区中&#xff0c;微软亚洲研究院开源的 Qlib 毫无疑问是王者级别的存在&#xff08;13k Stars&#xff09;。传统的量化策略通常依赖主观经验设定的指标&#xff08;如&#xff1a;均线突破、MACD背离&#xff09;&#xff0c;而 Qlib 则是让 人工智能&a…...

ARM ETMv4跟踪寄存器架构与调试实践

1. ARM ETMv4 跟踪寄存器架构概述ARM嵌入式跟踪宏单元(ETM)是处理器调试架构中的关键组件&#xff0c;ETMv4作为其第四代架构&#xff0c;提供了更强大的指令和数据跟踪能力。与传统的断点调试不同&#xff0c;ETM采用实时跟踪技术&#xff0c;能够在不中断处理器运行的情况下&…...

从零构建MCP服务:AI Agent扩展与外部工具集成实战

1. 项目概述&#xff1a;从零构建你的第一个MCP服务最近在AI应用开发圈里&#xff0c;MCP&#xff08;Model Context Protocol&#xff09;这个词的热度越来越高。简单来说&#xff0c;它就像是为AI大模型&#xff08;比如Claude、GPTs&#xff09;连接外部工具和数据源的一套“…...

拆解MC1496乘法器:如何在没有现成库的Multisim里,手动封装一个调幅核心模块

从零构建MC1496乘法器&#xff1a;Multisim高阶封装与调幅电路实战指南 在电子设计领域&#xff0c;仿真软件自带的元件库往往无法满足所有需求。当我们需要使用MC1496这类经典模拟乘法器时&#xff0c;Multisim的默认库可能让人束手无策。本文将带您深入芯片内部结构&#xff…...

在DOSBox中运行Appler模拟器:重温Apple II的复古计算体验

1. 项目概述&#xff1a;在DOS的土壤里复活Apple II的灵魂如果你和我一样&#xff0c;对计算机历史的交汇点着迷&#xff0c;那么“在8086的机器上模拟一颗6502的心脏”这个想法本身就充满了极客浪漫主义色彩。Appler正是这样一个跨越时代的产物——一个专为MS-DOS编写的Apple …...

从开源模型到API服务:OpenClaw部署实战与Docker+FastAPI方案解析

1. 项目概述&#xff1a;从开源模型到可部署服务的跨越最近在折腾大语言模型本地部署的朋友&#xff0c;可能都绕不开一个名字&#xff1a;OpenClaw。这个由智源研究院开源的模型&#xff0c;以其在代码生成和数学推理上的出色表现&#xff0c;吸引了不少开发者和研究者的目光。…...

普通人 0 基础能转网安吗?转行路径全面拆解,告诉你到底值不值得

前言 最近在后台有看到很多朋友问我关于网络安全转行的问题&#xff0c;今天做了一些总结&#xff0c;其中最多的是&#xff0c;觉得目前的工作活多钱少、不稳定、一眼望到头&#xff0c;还有一些就是目前工作稳定但是缺乏上升空间的。总的来说&#xff0c;大家主要的问题是&a…...