TLSF——一种高效的内存池实现

news2024/11/28 9:31:39

Arena

起源于计算内核关于堆内存使用的相关优化。
系统调用分配和回收内存的开销较大,一个优化是预先通过系统调用分配一大块内存,然后每次内存使用从大块内存中切出一小份内存使用。
Arena用于维护大块内存切分出来的大量小块内存,达到高效分配和释放内存的效果。

C++的malloc API封装了Arena逻辑和内存分配系统调用。
Arena的本来含义是“竞技场”,在有的地方直接翻译为“内存池”。

Velox使用了TLSF Arena。
在这里插入图片描述
所以Arena算法都需要回答两个问题:

  • 分配和释放内存的时间复杂度
  • 内存碎片大小

常见的Arena实现

  1. Sequential Fit:将FreeBlock根据大小从小到大排列。分配内存时,从小到大遍历,直到找到满足要求的最小FreeBlock。
  2. Segragated Free Lists:分成多个FreeBlock链。每一条链维护特定大小(或者特定大小范围)的FreeBlock。分配内存时,先找到对应的链条,然后再从链条中找到合适的Block。
  3. Buddy Systems。
    在这里插入图片描述
  4. Indexed Fist:FreeBlock的size为Key,FreeBlock的地址为Value,使用index(比如平衡树)维护Key。

时间复杂度对比

  1. Sequential Fit:O(N)顺序遍历,N是FreeBlock的个数。
  2. Segregated Free Lists:将其视为Sequential Fit的改进,每一个槽位不是一个Block,而是大小相同(或在一定范围内)的Block链条。当BlockSize类别较少,线性分割内存大小区间,直接根据BlockSize定位到对应的槽位:O(1)。当BlockSize类别较多,指数分割内存大小区间:O(1)时间定为槽位,顺序遍历槽位内的内存块大小O(M)。M为每个Block链的平均长度。
  3. Buddy Systems:O(log N)
  4. IndexedFit:O(log N)和索引相关,以平衡二叉树为例。

TLSF Arena

要解决的问题
TLSF(Two-Level Sergregated Fit)Arena的内存碎片较小,且分配释放时间复杂度都是O(1)。复杂度都是O(1)意味着TLSF可以运用于实时系统,因为其内存分配和释放耗时是有边界的。

数据结构
所有的内存块都被同时维护在两个链表中:

  • Segregated list:主要用于分配指定大小的BlockSize,仅维护FreeBlock。
  • Physical list:主要用于内存块的合并,维护所有Block,包括FreeBlock和分配出去的Block,所有的Block根据内存的物理地址顺次连接。

在这里插入图片描述
在这里插入图片描述

Segegated list分成两个level:

  • First Level:是一个数组,存储指向SecondLevel的指针,数组槽位表示BlockSize的量级,从右往左分别是24、25、…。
  • Second Level:是一个数组,数组槽位表示FirstLevel指定的内存大小的线性分割。槽位个数为divison,由Config配置的SLI(Second Level Index)决定。SLI为2,则Division为22=4,表示将内存现象分割为4份。槽位中存储指向对应大小的FreeBlock链表地址。
  • FirstLevel和SecondLevel右上角表示对应的BitMap,表示对应槽位是否有FreeBlock

举例

  1. 需要分配一块85B的内存块,首先判断其内存大小属于哪一个量级,⌊log(85)⌋ = 6。
  2. 然后查询FirstLevel,找到26的槽位,26槽位表示[26~27)的内存块都在这个槽位里找。
  3. 通过26槽位进而找到对应的SecondLevel,SecondLevel将大小区间划分为4份,分为为[2^6 + 0, 2^6 + 16), [2^6 + 16, 2^6 + 32), [2^6 + 32, 2^6 + 48), [2^6 + 48, 2^6 + 64)。
  4. 85=26+21落在第二个区间,于是从SecondLevel第二个槽位进入,找到对应的FreeBlock。
  5. FreeBlock对应的大小为89Byte,多出4Byte,由于FreeBlock大小至少为24,所以直接分配89Byte的内存块,4Byte为内部碎片。

BlockHeader主要字段

  • Size:块大小,无论是否使用都有的字段。
  • Prev_Phys_Block:执向前一个物理块,对应前文所述的PhysicalList,无论是否使用都有的字段。
  • Next_free和Pre_free:对应前文所述的SegragatedList,仅仅FreeBlock才有的字段。

在这里插入图片描述

定位函数

在这里插入图片描述
如函数mapping,给点一个内存块大小,可以快速定位对应的FreeBlock所在的FirstLevel偏移f,和Second Level偏移S。

  • f:如前文所述,f决定的是内存大小的量级,可以直接通过log计算得到。
  • s:s决定的是内存大小量级内线性分割的偏移,(size-2f)是超出对应两级最小值的大小。SecondLevel将[2f,2f+1)的内存区间等分成2^SLI份,所以该公式是对应大小所在的槽位。

具体到代码实现,log计算就是对应值的二进制表示的最左边1所在位数,比如十进制数460,最左边的1在第8位,其大小量级就是28,就是FirstLevel的偏移f为8。后面紧跟SLI位数字表示SeconfLevel的偏移s,下图是1100,也就是12。

通过简单计算就可以定位到对应大小的FreeBlock,时间复杂度为O(1)。

总结

其实TLSF是对Segregated Free List的改进。Segregated Free List有两种:

  • 如果线性分割,则O(1)的时间复杂度就可以找对应的FreeBlock,但是需要维护的槽位过多,设想线性分割的Segregated Free Lists,最大内存块为1G,碎片Fragment限定到16Byte内,则需要划分1G/16=2^26个槽位。
  • 如果指数分割,可以大大减少槽位个数,同样是最大内存块为1G,碎片Fragment限定到16Byte内,只需要log(1G)=30个槽位,但是每一个槽位里内存大小值域变化较大,找到合适的FreeBlock需要顺序遍历,时间复杂度为O(M),M为每一个槽位里的平均FreeBlock个数。

所有,当内存大小较小,线性分割的Segregated Free Lists的效果更好(槽位个数在可接受范围内,时间复杂度为O(1)),当内存大小区间较大,指数分割的Segregated Free Lists的效果更好(主要为了槽位数在可控范围内。)

一个自然优化思路就是将线性分割和指数分割结合起来,这样既可以减少槽位个数,又可以快速定位槽位。
TLSF就是这样做,FirstLevel用于指数分割,尽可能减少了槽位数,Second用于线性分割,可以快速定位FreeBlock。

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

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

相关文章

网站不被谷歌收录的常见原因及解决办法

现如今的互联网中,流量获取的渠道多种多样,但对于独立站而言,Google仍然是一个重要的流量来源。这是因为Google拥有庞大的用户基础,通过Google可以让潜在用户更容易发现我们的网站。然而,现实情况是,一些网…

STM32 — PWM介绍和使用PWM实现呼吸灯效果

目录 PWM介绍 PWM输出模式: PWM占空比: PWM周期与频率公式: 使用PWM点亮LED灯实现呼吸灯效果 1. 在 SYS 选项里,将 Debug 设为 Serial Wire​编辑 2. 将 RCC 里的 HSE 设置为 Crystal/Ceramic Resonator 3. 时钟配置 4.配…

信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】

信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】

信息系统项目管理师教程 第四版【第2章-信息技术发展-思维导图】

信息系统项目管理师教程 第四版【第2章-信息技术发展-思维导图】

视频格式高效转换:MP4视频批量转MKV格式的方法

随着数字媒体技术的不断发展,视频格式转换已经成为了我们日常工作中不可或缺的一部分。不同的视频格式适用于不同的场景和设备,因此将视频从一种格式转换为另一种格式往往是我们必须完成的任务。在本文中,我们将重点介绍如何运用云炫AI智剪高…

读图数据库实战笔记02_图数据建模

1. 概念 1.1. 实体 1.1.1. 通常用名词来表示 1.1.2. 描述一个领域中的事物或者事物类型 1.1.2.1. 汽车 1.1.2.2. 用户 1.1.2.3. 地理位置 1.1.3. 在逻辑模型和技术实现过程中,实体通常会变成“顶点” 1.2. 关系 1.2.1. 用动词(或动词短语&#…

SpringCloud 微服务全栈体系(六)

第八章 Gateway 服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管…

RK3568平台 IIC子系统框架

一.简介 IIC只有两条线,一条串行数据线SDA;一条是时钟线SCL。使用SCL,SDA这两条线就实现了设备之间的数据交互。 I2C通信可以一对一(1个主设备对1个从设备),也可以一对多(1个主设备对多个从设…

React Router初学者入门指南(2023版)

React Router,简单来说,是一个帮助处理React应用程序中导航和路由的库。它是用于管理React中路由的最流行的路由工具。如果你对路由的概念不熟悉,可以将其视为在网站的不同部分之间导航的过程。例如,当你进入网站的“联系我们”部…

UE5实现相机水平矫正

UE5实现相机水平矫正 思路,用HIT获得基于相机视角的 离散采样点,然后根据距离相机距离进行权重分析。 距离越近,采样约中心,即越接近人眼注意点,最后算出加权平均高度,赋予给相机,相机将水平旋…

C++ -- 深入理解多态

前言:多态的概念,通俗地来讲就是多种形态。当我们要完成某个行为的时候,不同的对象去完成时会产生不同的状态,这就叫做多态。具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。多态在C的类和对象中…

python裁剪图片

我原本想找到一个小一点的彩色人脸数据集,但是都没有找到合适的 但是我找到了一个人脸数据集的封面 于是我把这两个图片裁开,得到了6464张彩色人脸照片 from PIL import Image# 打开大图 big_image Image.open(female.jpg) # 获取大图的宽度和高度 wid…

windows 系统不设置密码也能远程登陆

前言 如果windows系统不设置密码,默认情况下是不能远程登陆的 解决办法 按下winr,输入gpedit.msc 再回车 点击windows设置 ----安全设置 ------本地策略-----安全选项 设置为禁用 远程就可以不输入密码了

PMI-ACP(103:1-16)

英文名:ACP 外文名:Agile Certified Practitioner 中文名:敏捷管理专业人士资格认证 是由 美国项目管理协会 PMI Project Management Institute 发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证。 一年开展4次考…

摆玩具[算法赛](差分)

本题链接:用户登录 题目: 样例: 输入 5 2 2 5 7 10 13 输出 8 思路: 由题意,这是一个递增的数组,其次要求最小的极差,对 数组 进行分成 k 个分段数组。 由于是一个递增的数组&#xf…

postgresql14管理(六)-备份与恢复

定义 备份(backup):通过物理复制或逻辑导出的方式,将数据库的文件或结构和数据拷贝到其他位置进行存储; 还原(restore):是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状…

4.多层感知机

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 多层感知机一、感知机1、感知机2、训练感知机3、图形解释4、收敛定理5、XOR问题6、总结 二、多层感知机1、XOR2、单隐藏层3、单隐藏层-单分类4、为什么需要非线性激活函数5、Sigmoid函数6、Tanh函数7、ReLU函数8、多类分…

C语言十进制转其它进制

短除法介绍 短除法: 主要功能为将十进制数据转为其它进制的数据,假设我们要转换为 X 进制,那么具体的流程如下: 十进制数字不断除以 X,直到商为 0 记录每次计算得到的余数 将余数倒序输出,即为对应的 X 进…

C# 递归算法使用简介_常用整理

一、递归简介 递归算法是一种直接或者间接调用自身函数或者方法的算法。 递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。 递归本质是循环&a…

正五边形的周长 题解

描述 已知一个正五边形的一条边的长度是a,计算输出该正五边形的周长。 输入 一行一个正整数a,表示该正五边形的边长。a的数值不会超过int的范围。 输出 一行一个正整数,表示这个该正五边形的周长,也就是5条边加起来的和。 输入样…