TLSF内存管理算法原理详解

news2024/12/24 2:02:07

 TLSF算法原理概述

        TLSF算法的核心优势在于其通过位运算执行内存块匹配算法,并兼顾了内存管理的额外内存消耗,无论是从内存池申请内存块还是释放内存块回内存池其操作都是O(1)。TLSF组织了一张一二级索引表映射其所有管理内存块的闲忙状态,并通过一个二维指针数组挂载所有空闲块双向链表的首节点。

        一二级索引表中,一级索引通过一个无符号整形变量,变量所占字节由平台决定32位或64位,变量中每个bit映射一级内存块,内存块通过大小划分等级,等级组织上以2的指数幂划分,例如2^7 、2^8 、2^9 ...分别对应一级索引值7、8、9 ...,将内存块划分到128/256/512...内;这有一点需要注意的是一级索引值(FL)与一级索引等级(FLi),一级索引值指的是内存块对应的一级索引范围起始值的2的指数幂,例如一级索引值8对应的起始值28 =256,而一级索引等级对应的是一级索引无符号整形变量的bit index,通常会有一个一级索引偏移值,一级索引值减去一级索引偏移值得到一级索引等级,这个一级索引偏移值对应的就是一级索引表的起始等级,例如偏移值为7,表明一级索引值2^7 对应的就是第1级一级索引(等级从1开始),计算出的一级索引值减去偏移值7,即为一级索引等级,小于2^7 = 128字节的内存块都将挂载到一级范围内管理;设置一级偏移值目的是为了方便后面计算二级索引表以及挂载空闲块链表首节点的二维数组的下标,避免空间浪费。

        一二级索引表中,二级索引表是一个无符号整形一维数组,进一步将内存块等级范围进行细分,其一维下标就是一级索引值,对应的就是该一级索引下各内存块进一步划分,划分方式为等分,划分依据是通过一个颗粒度变量决定通常取一个经验值,32位平台下通常为2^5 /2^4 即划分为32份,例如一级索引值为8时,一级索引范围为2^8 ~2^9 = 256 ~ 512之间,划分32份每份为256/32=8字节,二级进一步细分为32个8字节,各内存块根据大小放入对应的细分等级下管理。

        二级链表头指针数组,挂载所有空闲块双向链表首节点的二维数组,是空闲内存块的管理实体,无论是申请还是释放,根据目标内存块的大小,计算出对应的一二级索引,对应的就是二维数组的下标,例如一二级索引fl,sl = [1, 2],对应的block[1][2]中存的就是272~280范围内的空闲块链表首节点。

        申请内存块 tlsf_malloc(size),大致流程为:根据size计算目标空闲块所处一二级索引值,并转换成下标二级链表头指针数组的下标,取出目标内存块所在链表头节点,如果目标链表中还有空闲块,则直接取出首节点的空闲块即将该节点移出所处的空闲链表,如果目标链表中没有空闲块则向上一级继续寻找,二级索引链表没有就将一级索引也向上一级,如果都没有则分配失败;成功取出空闲块之后,需要判断空闲块是否大于size,如果大于足够的空间则需要对该空闲块进行切割,并将切割出的剩余空闲块重新插入空闲链表中。

释放内存块 tlsf_free(void * p),大致流程为:根据指针p向前偏移一个块头,得到内存块的块头即得到内存块的信息,将内存块数据域清除,并将其与其物理上的前一个空闲块合并(如果有这个空闲块),再将其与其物理上的后一个空闲块合并(如果有这个空闲块),将合并后的空闲块重新插入空闲链表。

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

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

相关文章

简单聊下Redis的主从复制和哨兵机制以及集群(面试题)

ChatGPT的简答: Redis的主从复制(Master-Slave Replication)是指将一个Redis服务器的数据复制到其他Redis服务器的过程,其中一个服务器作为主节点(Master),而其他服务器作为从节点(S…

基于SSM的居家养老系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

快速学习如何注册域名企业邮箱,只需5分钟

网站最重要的一个东西,就是你要有一个域名邮箱,显得你的邮箱更加专业,怎么样去申请一个域名邮箱,之前也出过一些内容给过大家,很多方法已经过时了,今天给大家更新一个最新版的,怎么样去申请一个…

【C++代码】安排行程,N皇后,解数独--代码随想录

题目:重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必…

6、实现多段运动【51单片机控制步进电机-TB6600系列】

摘要:本节介绍用控制步进电机三个主要参数角度、速度、方向,实现简单的步进电机多段控制 一、目标功能 输入多个目标角度,以及每个角度对应的速度,实现步进电机的多段多速度转动 二、计算过程 2.1 简化C与n函数关系 根据上一节内…

Go基础——基础语法

1、简介 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。语法类似于C,专为高性能和并发程序而设计。通常用于网络编程、云服务器、游戏服务器、DevOps、Web应用、分布式系统、容器虚…

[AutoSAR系列] 1.3 AutoSar 架构

依AutoSAR及经验辛苦整理,原创保护,禁止转载。 专栏 《深入浅出AutoSAR》 1. 整体架构 ​ 图片来源: AutoSar 官网 从官往图中可以看出autosar作为汽车ECU软件架构,是通过分层来实现软硬件隔离。就像大多数操作系统一样&#xff…

Linux系统编程_线程:线程、互斥量、条件变量

1. 线程概述(与进程的区别及线程的优势)(437.1) Linux多线程编程初探 https://www.cnblogs.com/xiehongfeng100/p/4620852.html 进程与线程 典型的 UNIX/Linux 进程可以看成只有一个控制线程:一个进程在同一时刻只做…

低概率Bug,研发敷衍说复现不到

测试工作中,经常会遇到一些低概率出现的问题,如果再是个严重问题,那测试人员的压力无疑是很大的,一方面是因为低概率难以复现,另一面则是来自项目组的压力。 如何在测试时减少此类问题的重复投入,我的思考如…

I/O设备的概念和分类,I/O控制器

文章目录 1.什么是I/O设备2.按使用特性分类1.人机交互类外部设备2.存储设备3.网络通信设备 3.按传输速率分类1.低速设备:2.中速设备:3.高速设备: 4.按信息交换的单位分类1.块设备:2.字符设备: 5.I/O设备的机械部件6.I/O设备的电子部件(I/O控制器)1.接收和…

Python实现双目标定、畸变矫正、立体矫正

一,双目标定、畸变矫正、立体矫正的作用 双目目标定: 3D重建和测距:通过双目目标定,您可以确定两个摄像头之间的相对位置和朝向,从而能够根据视差信息计算物体的深度,进行三维重建和测距。姿态估计&#xf…

【ROS入门】机器人系统仿真——相关组件以及URDF集成Rviz

文章结构 相关组件URDF(Unified Robot Description Format)——创建机器人模型Gazebo——搭建仿真环境Rviz(ROS Visualization Tool)——显示机器人各种传感器感知到的环境信息 URDF集成RvizURDF相关语法robotlinkjoint URDF优化——xacro相关语法属性与算数运算宏文件包含 实操…

GD32_定时器输入捕获波形频率

GD32_定时器输入捕获波形频率(多通道轮询) 之前项目上用到一个使用定时器捕获输入采集风扇波形频率得到风扇转速的模块,作为笔记简单记录以下当时的逻辑结构和遇到的问题,有需要参考源码、有疑问或需要提供帮助的可以留言告知 。…

怎么防止公司终端电脑文件资料、设计图纸外泄?

PC营销页: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 天锐绿盾防泄密软件主要通过以下几种方式来防止公司设计图纸泄露: 透明加密:天锐绿盾采用透明加密技术,对设计图纸进行加密。这种加密方…

护眼灯台灯哪个牌子好?五款公认最专业护眼台灯推荐

今天跟大家聊聊现在热门的灯具,护眼台灯。目前的护眼台灯市场水很深,有很多不符标准、不适宜学习用光的护眼台灯,以低价吸引大家,在市面上热销,甚至销量非常高。其实这类产品在照度、光衰弱等多项核心参数上根本没有进…

p11 第63题 请设计一个判断字母序列是否对称的算法 桂林电子科技大学015年 数据结构(c语言代码实现)

本题代码如下 int symmetry(linklist* L)//判断循环双链表是否对称 {lnode* p (*L)->next, * q (*L)->prior;while (p ! q && q->next ! p){if (p->data ! q->data)return 0;else{p p->next;q q->prior;}}return 1; } 完整测试代码 #inclu…

快速排序(c语言代码实现)

交换排序:快速排序(不稳定的排序) 快速排序(Quick Sort)是一种常见的排序算法,它采用分治法的思想,对待排序序列进行划分,使得划分出的子序列可以分别进行排序,最终使整…

Python OpenCV剪裁图片并修改对应的Labelme标注文件

Python OpenCV剪裁图片并修改对应的Labelme标注文件 前言前提条件相关介绍实验环境剪裁图片并修改对应的Labelme标注文件代码实现 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-P…

RAG之微调垂域BGE的经验之谈

文章目录 前言数据格式部分代码训练参数接下来的尝试总结 前言 随着大模型的爆火,很多垂域行业都开始使用大模型来优化自己的业务,最典型的方法就是RAG(检索增强生成)了。简单来说就是利用检索技术,找出与用户问题相关…

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址:https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示: 2.php环境 解释:建议使用phpstudy进行安装,安装较为简单 链接:https://www.xp.cn/ 图示: 二、第…