内存管理:TLSF算法原理分析

news2025/1/16 8:51:11

1、动态内存分配DSA:

动态内存分配(DSA)在计算机中十分重要,其主要用于在程序运行时,根据需要分配和释放内存。

(1)、DSA的几个要点分别为:

  • 内存管理方式:动态内存分配与静态内存分配 相对应,静态内存分配是在程序编译时为变量分配固定大小的内存空间,而动态内存分配是在程序运行时根据需要动态调整内存空间。

  • 内存分配函数:编程语言通常提供内置的内存分配函数,如C/C++中的malloccalloc和C++中的new,用于在堆(heap)中分配内存。这些函数返回一个指向分配内存的指针。

  • 内存释放:动态分配的内存必须在使用完后进行释放,以防止内存泄漏。释放内存的函数是C/C++中的free和C++中的delete。不释放已分配的内存会导致程序内存占用增加,最终可能导致系统性能下降。

  • 内存泄漏:如果分配的内存在使用后没有被释放,就会发生内存泄漏。这会导致内存逐渐耗尽,最终可能导致程序崩溃或系统不稳定。

  • 碎片问题:频繁的动态内存分配和释放可能导致内存碎片问题。分为外部碎片(内存块之间的未使用空间)和内部碎片(已分配内存块内部未使用的部分)。

  • 动态数据结构:DSA允许在运行时创建动态数据结构,如链表、树和图。这些数据结构的大小和形状可以根据程序的需求动态变化。

  • 性能开销:与静态内存分配相比,动态内存分配需要更多的系统开销,包括内存分配表的维护、碎片整理等。因此,在某些情况下,需要权衡是否使用动态内存分配。

  • 错误处理:动态内存分配可能因为内存不足或其他原因失败。程序应该对分配失败进行适当的错误处理,避免崩溃或不可预料的行为。

(2)、DSA的几个关键点为:

  • 快速响应时间(Fast response time):响应时间,理解为平时当申请分配size大小内存时,算法从池中查找到合适内存块的耗时,当然越短越好。
  • 有界响应时间(Bounded response time):内存分配最坏的响应时间,比如使某空闲list算法,在一些情形下直到遍历到最后一个节点,才能发现合适的内存块,比正常找到慢非常多。这种边界性超长响应对一些实时要求高的系统或软件并不友好。
  • 高效内存使用(Efficient Memory Use):内存的高效使用,这是最复杂且综合设计,必涉及内存碎片化的处理。比如内存池总有1000个字节内存,运行到一段时间后,500字节占用,500字节空闲,但占用与空闲的内存刚好单字节一一交错。这时你会发现,虽然池里面总共剩余500字节,你确连2个字节的连续内存都分配不出来。

(4)、常见的分配策略:

  • Sequential Fit:最基础的算法,空闲链表法,所有内存空闲块都放到一个单向/双向list中,查找时会有边界响应问题。
  • Segregated Fit:对Sequential Fit进行改进,对所有内存块按其大小区间放到不同list中,这些list首地址组成array,查找速度更快,dlmalloc算法使用该策略。
  • Buddy System:对Segregate Fit算法的改进,更好的切割和合并效率,分配时效不错但内部碎片化问题比较严重,典型算法策略Binary Buddies,Fibonacci Buddies, Weighted Buddies,Double Buddies。
  • Indexed Fit:基于使用高级结构索引空闲内存块。典型算法策略:基于平衡树的“Best Fit”,基于笛卡尔树存储的Stephenson’s Fast-Fit等。在一些情况下,比Segregated系列效果更好。
  • Bitmap Fit:位图法,算是Indexed Fit算法的改进,使用小段内存表示的位图来确认内存块的占用或空闲,其通过降低缓存未命中的概率来提高响应时间。

2、TLSF算法:

(1)、TLSF简介:

TLSF(全称Two-Level Segregated Fit),两级隔离Fit内存分配器,是一款通用的动态内存分配,专门用于实时要求。

其有以下特点:

  • 算法复杂度为O(1);
  • 每次分配的开销极低(4字节);
  • 低碎片化;
  • 主要采用两级位图(Two-Level Bitmap)与分级空闲块链表(Segregated Free List)的数据结构管理动态内存池(memory pool)以及其中的空闲块(free blocks),用Good-Fit的策略进行分配。

(2)、分级空闲块链表(Segregated Free List):

分级空闲块链表(Segregated Free List)的设计思想是将空闲块按照大小分级,形成了不同块大小范围的分级,组内空闲块用链表链接起来。每次分配时先按分级大小范围查找到相应链表,再从相应链表挨个检索合适的空闲块,如果找不到,就在大小范围更大的一级查找,直到找到合适的块分配出去。

(3)、两级位图(Two-Level Bitmap):

使用位图的优势:

  • 节省存储空间:用1-bit表示某个区间范围大小的空闲块是否存在;
  • 位操作速度快:部分体系结构有加速特殊位操作的指令(如clz, ffs,fls)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4GXR36j-1692942875116)(file://C:\Users\te199\AppData\Roaming\marktext\images\2023-08-25-13-43-17-image.png?msec=1692942197503)]

TLSF采用了两级位图(Two-Level Bitmap)来管理不同大小范围的空闲块链(free block lists)。 上图中包含三个虚线矩形框分别是:

  • 第一级位图(First-Level Bitmap),表示内存块的粗粒度范围,一般是2的幂次粒度(例如[ 2^n ~ 2^n+1 ])

  • 第二级位图(Secend-Level Bitmap)是一个数组,一级位图中的每一位对应这个数组的一项,表示内存块的细粒度范围(例如[ 2^n + 02^n-2 ~ 2^n + 12^n-2 ])

  • 第三个框是内存中真正的空闲内存块(free blocks)

(4)、Good-fit分配策略:

a、Best-fit(内部碎片最优化):

常规思路是:找到能满足内存请求大小的最小空闲块,就会有下面的流程(以搜索大小为69字节的空闲块为例)

  • 基于位运算找到请求大小所在的第一级位图(First-Level bitmap)对应的粗粒度范围([ 64 ~ 128 ]),也就是二级位图的索引

  • 在粗粒度范围内,根据二级位图索引检索第二级位图(Second-Level bitmap)得到细粒度范围([ 68 ~ 70 ])

  • 如上图所示,沿着右下角空闲块链表可以检索到69字节的那一块是Best-fit

Best-fit策略最主要的问题还在于第三步,仍然需要检索对应范围的那一条空闲块链表,存在潜在的时间复杂度。

b、Good-fit:

Good-fit思路与Best-fit不同之处在于,Good-fit并不保证找到满足需求的最小空闲块,而是尽可能接近要分配的大小。

还以上述搜索大小为69字节的空闲块为例,Good-fit并不是找到[68 ~ 70]这一范围,而是比这个范围稍微大一点儿的范围(例如[71 ~ 73])。这样设计的好处就是[71 ~ 73]对应的空闲块链中每一块都能满足需求,不需要检索空闲块链表找到最小的,而是直接取空闲块链中第一块即可。整体上还不会造成太多碎片。

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

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

相关文章

JMeter性能测试(上)

一、基础简介 界面 打开方式 双击 jmeter.bat双击 ApacheJMeter.jsr命令行输入 java -jar ApacheJMeter.jar 目录 BIN 目录:存放可执行文件和配置文件 docs目录:api文档,用于开发扩展组件 printable-docs目录:用户帮助手册 li…

在线流程图软件哪个好?5款打工人必备的效率神器!

​流程图是可视化工具的一种,被广泛用于呈现和理解复杂的流程和工作流程。本篇文章我们将向你介绍5款优秀的在线流程图软件,助你提升工作效率,它们分别是:boardmix、Lucidchart、draw.io、Creately、Coggle。 在选择在线流程图软…

对numpy以及pandas中axis的理解

用线代的概念来理解轴,也就是dimension 在numpy中,最小的一维数组就可以看做是一个行列式,通常一个行列式写作如下形式 在numpy中就是这样的形式 anp.arange(4) #array([0, 1, 2, 3]) 对一个二维的矩阵,通常可以由两个行列式组…

用AI重构的钉钉,“钱”路在何方?

点击关注 文|郝 鑫,编|刘雨琦 钉钉2023年生态大会,离开了两年的无招,遇到了单飞9天的钉钉。 “做小钉钉、做好钉钉、做酷钉钉”,无招重申了钉钉的方向。 无招提到的三点,再加上“高质量增长”…

【Windows系统】资源管理器右键卡顿案例

问题 最近在使用办公电脑过程中,发现在Windows系统资源管理器中使用右键会出现卡顿现象。这是一台经常使用,工作日上班都会使用,以前没有这个问题。 出现问题的环境:windows版本:win10_x64(22H2&#xff…

Camunda 7.x 系列【27】手工任务 业务规则任务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.10 本系列Camunda 版本 7.19.0 源码地址: 文章目录 1. 手工任务2. 业务规则任务1. 手工任务 Manual Task手工任务是定义在流程引擎之外的任务,流程引擎不需要了解,也不需要提供系统或用户界面的工作。…

iOS脱壳技术(二):深入探讨dumpdecrypted工具的高级使用方法

前言 应用程序脱壳是指从iOS应用程序中提取其未加密的二进制可执行文件,通常是Mach-O格式。这可以帮助我们深入研究应用程序的底层代码、算法、逻辑以及数据结构。这在逆向工程、性能优化、安全性分析等方面都有着重要的应用。 在上一篇内容中我们已经介绍了Clutc…

Mybatis的动态SQL分页及特殊字符应用

目录 ​编辑 前言: 1.mybatis的分页 1.1分页的应用场景 1.2分页的使用方式 2.mybatis中特殊字符处理 2.1mybatis中特殊字符介绍 2.2mybatis中特殊字符的使用方式 前言: 上篇我已经写了Mybatis动态之灵活使用,接着上篇写mybatis的分页…

Redis下载与安装

文章目录 Redis简介下载,安装和配置(cmd)图形化工具 Redis 简介 下载,安装和配置(cmd) 开启redis服务 1.在解压出来的文件夹中打开cmd 2.输入 redis-server.exe redis.windows.conf即可开启服务 可以看到…

Android 之 AlarmManager (闹钟服务)

本节引言: 本节带来的Android中的AlarmManager(闹钟服务),听名字我们知道可以通过它开发手机闹钟类的APP, 而在文档中的解释是:在特定的时刻为我们广播一个指定的Intent,简单说就是我们自己定一个时间, 然后…

Pycharm通过SSH配置centos上Spark环境

直接在shell进行pyspark进行编程,程序没有办法写得太长,而且我们希望能够实现一个及时给出结果的编程环境,可以使用pycharm连接centos上的spark,进行本地编程,同步到centos系统中运行程序,并把结果返回pych…

go:正确引入自己编写的包(如何在 Go 中正确引入自己编写的包)

前言 目录如下: 具体教程 1. 工作空间(我的是根目录)新建 go.work 文件 文件内容如下: go 1.21.0use (./tuchuang./tuchuang/testm ) 2. 添加go.mod文件 1. 包文件夹下 进入testm目录执行 go mod init testModule 2. 引用目…

web3d调试

web里嘛,Spector当然是首选 这个有一点点问题 我希望看见某个shader的执行耗时,这个无法做到诶 然后我查API,发现有个api用来query timestamp,然后兴致冲冲的把他写好了 然后发现报错需要开谷歌的一个设置,而且要在谷歌…

无用小程序之——论如何将导出为txt格式的QQ聊天记录进行合并

众所周知,QQ的PC端向我们提供了导出聊天记录的功能,并且允许我们导出为可读的文本文档(txt)格式,就像这样: 然后导出之后就是这样的(不要怪我啥都看不见,这已经是我能提供的最多的信…

MFC 硬件序列号

获取cpu序列号函数 uint64_t CpuId() { //获取CPU序列号int cpuInfo[4] { 0 };__cpuid(cpuInfo, 1);uint64_t serialNumber 0;if ((cpuInfo[3] & (1 << 3)) ! 0) {serialNumber static_cast<std::uint64_t>(_getwch()) << 32;}return serialNumber; …

2023年你需要知道的最佳预算Wi-Fi路由器清单

买新路由器?让我们帮助你挑选一些既有很多功能和性能,又经济实惠的产品。 购买Wi-Fi路由器并不一定要倾家荡产,尤其是如果你不需要一个提供数百Mbps速度的路由器。廉价路由器是一个很好的选择,它包含了许多功能,不会对钱包造成影响。 一、2023年在廉价Wi-Fi路由器中寻找…

754. 到达终点数字

754. 到达终点数字 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 754. 到达终点数字 https://leetcode.cn/problems/reach-a-number/description/ 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xf…

5个流程图模板网站,帮你轻松绘制专业流程图

在复杂的项目管理和团队协作中&#xff0c;流程图成为了一个必不可少的工具。从零开始创建流程图可能会很耗时&#xff0c;同时也需要一定的技能。使用模板可以让流程图方便制作又保持高颜值&#xff0c;降低制作的成本&#xff0c;一款模板众多、功能强大、具有丰富编辑工具的…

AP6315 DC单节锂电池充电IC 同步2A锂电芯片

概述 是一款面向5V交流适配器的2A锂离子电池充电器。它是采用1.5MHz固定频率的同步降压型转换器&#xff0c;因此具有高达90%以上的充电效率&#xff0c;自身发热量极小。包括完整的充电终止电路、自动再充电和一个达1%的4.2V预设充电电压&#xff0c;内部集成了防反灌保护、输…

2022年30m全国逐年土地覆被数据

1.研究背景 2023年8月,武汉大学杨杰和黄昕教授团队向公众更新发布了CLCD 2022年全国土地覆数据(V1.0.2)。而CLCD 2021年全国土地覆数据(V1.0.1)也是在去年8月向公众更新发布。 中国在过去几十年中经济和人口迅速发展,土地覆盖随之发生巨大变化,因此迫切需要对其进行连续…