内存管理:TLSF算法

news2024/9/24 4:28:53

动态内存分配DSA

DSA:Dynamic Storage Allocation,用于动态管理程序运行时所需的内存。动态内存分配涉及在程序运行时根据需要分配和释放内存,以存储数据结构和数据。

  1. 内存管理方式:动态内存分配与静态内存分配相对应,静态内存分配是在程序编译时为变量分配固定大小的空间,而动态内存分配是在程序运行时根据需要动态调整内存空间。
  2. 内存分配函数:重新语言通常提供内置的内存分配函数,如C/C++中的malloc、calloc和C++中new,用于在中分配内存。这些函数返回一个指向分配内存首地址的指针。
  3. 内存释放:动态分配的内存必须在使用完后进行释放,以防止内存泄漏。释放内存的函数是C/C++中的free和C++中的delete。不释放已分配的内存会导致程序内存占用增加,最终可能导致系统性能下降。
  4. 内存泄漏:如果分配的内存在使用完后没有被释放,就会发生内存泄漏。这会导致内存逐渐耗尽,最终可能导致程序崩溃或系统不稳定。
  5. 碎片问题:频繁的动态内存分配和释放可能导致外碎片增加。
  6. 动态数据结构:DSA允许在运行时创建动态数据结构,如链表、树和图、这些数据结构的大小和形状可以根据程序的需求动态变化。
  7. 性能开销:与静态内存分配相比,动态内存分配需要更多的系统开销,包括内存分配表的维护、碎片整理等。因此,在某些情况下,需要权衡是否使用动态内存分配。
  8. 错误处理:动态内存分配可能因为内存不足或其它原因失败。程序应该对分配失败进行适当的错误处理,避免崩溃或不可预料的行为。

DSA的衡量指标

  1. 快速响应时间:当申请分配size大小的内存时,算法耗费多少时间查找到合适内存块,越短越好。
  2. 有界响应时间:内存分配最坏的响应时间,比如某空闲list算法,在一些情况下直到遍历到最后一个节点,才能发现合适的内存块,比正常找到慢很多。这种边界性超长响应对一些实时要求高的系统或软件并不友好。
  3. 高效内存使用:设计内存碎片化的处理。比如内存池总共有1000个字节内存,运行到一段时间后,500字节占用,500字节空闲,但占用与空闲的内存刚好单字节一一交错。这时虽然内存里还有500字节,但一个连续的2字节的内存都无法分配。

常见的分配策略

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

TLSF算法

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

其有以下特别:

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

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

两级位图(Two-Level Bitmap)
使用位图的优势:

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

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

  • 第一级位图(First-Level Bitmap),表示内存块的粗粒度范围,一般是2的幂次粒度(例如2n~2n+1)。
  • 第二季位图(Second-Level Bitmap)是一个数组,一级位图中的每一位,对应这个数组的一项,表示内存块的细粒度范围(例如(2n + 02 n-2~ 2n+12n-2))。
  • 第三个框是内存中真正的空闲内存块(free blocks)

Best-fit(内部碎片最优化)
在这里插入图片描述

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

  1. 基于位运算找到请求大小所在的第一级位图对应的粗粒度范围(64~128)。
  2. 在粗粒度范围内,根据二级位图索引检索第二级位图得到细粒度范围(68~70).
  3. 如上图所示,沿着右下角空闲块链表可以检索到69字节的那一块是Best-fit。

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

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

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

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

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

相关文章

json格式存储b64编码的rgb raw数据

1.rgb raw数据准备 利用python将jpg里面的rgb raw数据提取出来。 import cv2# 读取 JPG 图像 image_path 1.jpg image cv2.imread(image_path)#imread读出来的顺序是BGR print("image shape:",image.shape)# 将图像由BGR转换为 RGB 数据 rgb_data cv2.cvtColor(im…

什么是水坑攻击

水坑攻击 1. 水坑攻击的概念1. 水坑攻击的原理2. 水坑攻击的常用手段3. 典型水坑攻击事件 1. 水坑攻击的概念 水坑攻击(Watering Hole Attack)是一种网络攻击方法,其名称来源于自然界的捕食方式。 攻击者会通过前期的调查或各种社会工程手段…

2023年【河北省安全员B证】免费试题及河北省安全员B证作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 河北省安全员B证免费试题考前必练!安全生产模拟考试一点通每个月更新河北省安全员B证作业考试题库题目及答案!多做几遍,其实通过河北省安全员B证在线考试很简单。 1、【多选题】一般…

计算机中了faust勒索病毒怎么办,faust勒索病毒解密,数据恢复

近年来网络技术得到了飞速发展,为人们的企业生产生活提供了极大便利,但随之而来的网络安全威胁也不断增加,近期,云天数据恢复中心收到了很多企业的求助,企业的计算机服务器遭到了faust勒索病毒攻击,导致企业…

【java学习—九】内部类(7)

文章目录 1. 概念2. 内部类特性3. 内部类实现多重继承的应用 1. 概念 (1)在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。     (2)Inner class 一般用在定…

亚马逊哪个站点好做?亚马逊全球站点介绍!

前言 亚马逊全球有18个站点,其中七大站点分别为:北美站、欧洲站、日本站、澳洲站、印度站、中东站、新加坡站。按照国家和地区分为中国、美国、加拿大、墨西哥、英国、德国、法国、西班牙、意大利、澳大利亚、日本、印度、土耳其、中东和巴西。不同的站…

GoLong的学习之路(十三)语法之标准库 log(日志包)的使用

上回书说到,flag的问题。这回说到日志。无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯。 文章目录 log配置logger配置日志前缀配置日志输出位置自定义logger …

vscode配置C/C++

首先下载 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 解压到一个方便的文件夹中 在环境变量中添加 C:\mingw64\bin验证添加的环境变量,打开cmd,输入gcc --version 进入vscode进行配置 安装插件 进行配置 gcc和g的配置文件…

基于ssm民宿推荐系统(2023年☆全网唯一)【附PPT|开发文档|表结构|万字文档(LW)和搭建文档】

主要功能 前台登录: 注册用户:用户账号、密码、姓名、头像、性别、年龄、手机、身份证号 用户: ①首页、近期活动展示、新闻资讯、系统简介、关于我们、近期活动推荐、热门客房推荐、查看更多 ②近期活动、民宿名称搜索、热门客房、客房名称…

常见排序实现

排序 1.排序的概念及其运用排序的概念 2.常见排序算法的实现插入排序直接插入排序希尔排序( 缩小增量排序 ) 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序快速排序优化快速排序非递归 归并排序非比较排序 3.排序算法复杂度及稳定性分析 1.排序的概念及其运用 排序的概…

SpringCloud之Sentinel概述和安装及简单整合

目录 Sentinel概述 基本介绍 Sentinel 基本核心概念 Sentinel安装 简单安装启动 启动配置项 SpringCloud简单整合 实战架构 父工程pom文件 teacher-service服务 student-service服务 测试 整合Sentinel Sentinel概述 基本介绍 Sentinel是阿里巴巴开源的一款微…

haproxy高可用集群

高可用集群 Haproxy :他是常用的负载均衡软件 Nginx 支持四层转发,和七层转发 Haproxy 也可以四层和七层转发 LVS的DR发和nat是基于四层还是七层的转? 都基于是四层转发&#xff08…

算法通过村第十七关-贪心|白银笔记|贪心高频问题

文章目录 前言区间问题判断区间是否重复合并区间插入区间 字符串分割加油站问题总结 前言 提示:如果生活把你的门关上了,那你就再打开,这就是门,门就是这样的。 --佚名 贪婪的思想不一定要理解的很透彻,但是贪婪的问题…

学习Java应该关注哪些网站?

前言 下面是我总结的一些不错的网站,可以收藏看一下哈~希望对你有帮助 一、入门教程类 主要是教程性质的网站,主要是新手学习参考以及相关知识的内容参考 1、菜鸟教程(https://www.runoob.com) 2、Java学习笔记(http…

2023年【广东省安全员A证第四批(主要负责人)】考试内容及广东省安全员A证第四批(主要负责人)模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批(主要负责人)考试内容根据新广东省安全员A证第四批(主要负责人)考试大纲要求,安全生产模拟考试一点通将广东省安全员A证第四批&#x…

红眼特效出处竟是斯大林电脑病毒

相信不少小伙伴看过这种红眼特效的视频,那么你知道这个特效最早出自哪里吗? 其实这个红眼病毒最早出于一个俄罗斯的电脑病毒斯大林上,一旦电脑感染这个病毒,屏幕上就会出现一个红眼特效的斯大林,同时不断播放前苏联国…

学习笔记:最小生成树

最小生成树 引入 我们定义无向连通图的 最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树。 注意:只有连通图才有生成树,而对于非连通图,只存在生成森林。 实现 求最小生成树的算法有 Prim…

力扣每日一题73:矩阵置零

题目描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2…

多线程---wait和notify

文章目录 使用场景使用方法原理notify VS notifyAll 使用场景 我们都知道线程的调度是“随机的”,但是我们在很多时候都希望多个线程能够按照一个预期的顺序来执行。wait和notify就是用来调配线程执行顺序的。 使用方法 public static void main(String[] args) {…

Hand Avatar: Free-Pose Hand Animation and Rendering from Monocular Video

Github: https://seanchenxy.github.io/HandAvatarWeb 1、结构摘要 MANO-HD模型:作为高分辨率网络拓扑来拟合个性化手部形状将手部几何结构分解为每个骨骼的刚性部分,再重新组合成对的几何编码,得到一个跨部分的一致占用场纹理建…