dlmalloc 2.8.6 源码详解(6)

ICG setup timing violation介绍? 门控时钟(clock gating)在RTL级电路设计过程中进行低功耗优化常用方法,能够有效降低动态功耗(翻转功耗)。Clock gating cell 可以由与门,与非门,或门或者或非门构成,但很容易产生Glitch。在实际使用中,一般用ICG(集成门控时钟单元)来完成clock gating。 下图展示了glitch的产生原因 在CTS时钟树综合的时候,ICG不会被看作sink,通常放置在source点附近,因此就会出现如上图这种结果。上图可以看出,在分析DFF到ICG的setup timing 阅读详情

本文章由vector03原创, 转载请注明出处.

邮箱地址: mmzsmm@163.com, 欢迎来信讨论.

 

3.4 sys_alloc

sys_alloc是dlmalloc中向系统获取内存的主要接口. 由于涉及到mmap, top-most segment, top chunk的交互, 相对要更复杂. 我们同样先介绍主要分配算法, 再详细分析子函数.

3.4.1 核心算法

基本上sys_alloc分为四个步骤,

1. 首先检查请求大小nb是否超出mmap_threshold的阈值. 如果是, 则放弃由分配器管理, 直接在mmap区开辟, 原因前面说过, 不再赘述.

2. 根据mspace设定及当前top space的使用情况, 向系统申请一块适当的内存.

Dlmalloc按照下面的顺序由主到次开辟,

第一, 如果允许MORECORE, 则优先通过MORECORE开辟连续内存空间.

连续空间开辟又分为如下几种情况,

若当前mspace处于诞生阶段, 则直接开辟nb + SYS_ALLOC_PADDING大小的空间.

若当前mspace已存在top, 则部分空间可利用top, 剩余nb – m->topsize + SYS_ALLOC_PADDING大小的空间向系统申请.

若MORECORE返回成功, 但空间不连续, 则会尝试扩展空间esize大小以满足分配需求. 如果空间扩展失败, 则反向MORECORE将之前申请的空间归还给系统.

第二, 如果上一步申请失败, 或不允许MORECORE, 则通过MMAP申请. 注意, 这里的MMAP同sys alloc步骤1的mmap是两码事. 这一步申请的结果是要归入mspace空间的.

第三, 倘若前两步都失败, 且允许非连续(noncontiguous)MORECORE, 则尝试直接在system heap上分配非连续空间. 这有些类似第一步中的扩展空间, 区别是此时已经明确top space不连续, 直接申请目标大小.

3. 根据申请成功的地址与原top space的关系, 对连续空间合并. 如果不能合并, 则新开区段. 申请的地址和大小保存在tbase和tsize临时变量里.

其中, 区段合并又分为两种. 若tbase与top-most区段末尾相毗邻, 则从后面合并. 这种情况适用于大部分MORECORE以及小部分MMAP申请到的空间.

若tbase与top-most区段开始相毗邻, 则从前面合并. 这种情况出现的比较少, 多在MMAP时产生, MORECORE虽然也可能出现该情况, 相对就更少.

4. 最后从已扩展的top space中划分chunk返回给用户. 这样就完成了sys_alloc的全部流程.

详细代码注释如下,

这个代码基本上就是本小节开始时介绍的流程, 相信看懂了前面的算法说明, 这里自然没有什么难度. 需要说明的仅有两点,

一个就是在Line4064和Line4065出现的判断, 先对nb做padding计算得到asize, 再判断其是否小于等于nb. 这里就是溢出检测, 对于两个无符号整数的加法, 这是比较便捷的检验方法. 类似的代码在dlmalloc中到处都是.

另一个参考Line4108, 这里同样是溢出检测. 因为MORECORE的入参在dlmalloc中被认为是有符号的. 而HALF_MAX_SIZE_T是size_t的一半, 以此来判断ssize是否溢出.

3.4.2 mmap_alloc

当nb大于mmap_threshold时, 会调用该函数直接进行mmap分配. 与sys_alloc通过其他途径申请的区别在于, dlmalloc对这类空间倾向于不长期持有, 也不纳入任何分箱或区段中. 可以认为它们是脱离dlmalloc管理的孤立内存区域.

既然是孤立内存, 首尾就不会有毗邻的chunk, 但直接mmap出来的payload地址未必是对齐的, 因此在对齐后会产生内部碎片. dlmalloc就将这些碎片伪装成一个chunk. 这样, 当用户释放这片内存时, 可以根据记录在prev_foot中的size信息找到当初mmap出来的首地址.

上图中, mmap分配的原始地址是mm, 经过对齐后的地址是p. dlmalloc将前面的对齐部分伪装成一个free chunk, 长度记录在p->prev_foot中. 当释放时, 就可以根据payload指针重新计算出mm的地址. 在结尾, 有长度为MMAP_FOOT_PAD的一段区域, 用来放置fake next chunk. 也就是保存magic以及fencepost.

代码注释如下,

3.4.3 prepend_alloc

在3.4.1小节中介绍了从系统申请的扩展内存会根据其首地址和旧区段之间的位置关系做合并. 倘若append到区段后面, 申请内存是比较简单的, 因为扩展地址会直接补充到top中, 只需切割top即可. 但如果prepend到前面情况就相对复杂了, 因为从原区段base到top之间的情况不明, 所以必须分情况讨论. 而prepend_alloc函数就是为此而写的.

该函数会在一开始将分配请求从扩展空间中切割出来, 剩余工作就是根据不同情况对remainder做相应处理,

1. 如果旧区段base与top是同一个地址, 直接移动top指针, 将remainder吸收到top中.

2. 如果旧区段base与dv是同一地址, 则扩充dv的范围.

3. 若旧区段开始是普通的free chunk, 则移动oldfirst指针, 将remainder和free chunk合并.

4. 若旧区段开始是inused chunk, 则将remainder插入回分箱.

代码注释如下,


3.4.4 add_segment

对于无法合并的扩展内存区域, dlmalloc最后会将它们作为新的segment插入.

创建新segment按照如下步骤进行,

1. 首先, 根据top, 查找到当前top-most区段, 并且定位出在其结尾的隐藏chunk.

2. 将top重新初始化为新的segment的基址.

3. 将mstate中保存的旧top-most区段信息push到旧区段的隐藏chunk里. 并将新区段信息记录在mstate中.

4. 旧区段末尾写入一连串fenceposts.

5. 若旧区段剩余的top可用, 则将旧top重新插入分箱系统中.

源码注释如下,

Line4016是top初始化函数, 该函数基本只是简单的信息记录, 并在末尾伪装隐藏chunk, 代码如下,

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go) 阅读详情

相关推荐

Unity中实现FairyGUI弹窗背景模糊的3种方法对比(附完整代码)

本文详细对比了Unity中实现FairyGUI弹窗背景模糊的3种方法,包括FairyGUI原生滤镜方案、多摄像机混合渲染方案和渲染纹理动态混合方案。每种方法均附有完整代码示例,帮助开发者根据项目需求选择最佳方案,实现镜头虚化模糊效果,提升游戏UI的视觉沉浸感。

ff678的博客 232

VPP代码阅读中文注解---dlmalloc.h

* Quickstart This library is all in one file to simplify the most common usage: ftp it, compile it (-O3), and link it into another program. All of the compile-time options default to reasonabl...

weixin_40870382的博客 1227

数据驱动的细胞动力学:从高通量成像到机器学习预测的完整实践指南

细胞动力学研究细胞群体随时间变化的规律和命运决策机制,是理解生命过程的基础。其核心原理在于将传统的定性观察转化为定量分析,通过高通量成像、单细胞测序等技术获取多维时序数据,并运用机器学习与统计模型挖掘数据中的深层模式。这一技术价值在于实现从“描述现象”到“预测行为”的范式转变,显著提升研究的客观性和可重复性。在应用场景上,它广泛应用于药物筛选、疾病机制研究和发育生物学等领域,能够加速靶点发现和疗效评估。本文聚焦于数据驱动的细胞动力学分析,详细拆解了从实验设计、图像处理、单细胞追踪到特征工程与建模预测的端到端

weixin_29056781的博客 269

dlmalloc 简析

本文基于android kitkat所用的dlmalloc版本进行分析。malloc/free work flow malloc/free是libc库提供的函数,主要是用户层的操作,而不是内核的系统调用。一般的heap管理是通过sbrk或者mmap函数来向系统获取大量的内存(只是虚拟的内存地址),然后由特定的heap管理算法来管理用户程序申请/释放内存(比如dlmalloc)。有一...

aa168888的博客 570

利用python语言进行相机标定

利用python语言进行相机标定 目录利用python语言进行相机标定一、相机标定相关原理1.相机标定简介2.坐标映射2.1图像坐标系1)图像坐标系(Pixel coordinate system)2)成像平面坐标系(Retinal coordinate system)3)摄像机坐标系(Camera coordinate system)4)世界坐标系(World coordinate system)二、相机标定算法流程1.镜头畸变1.1径向畸变1.2切向畸变2.相机标定算法求解外参内参和单应矩阵关系求解(张

qq_44818951的博客 4700

Bartender 2021破解版安装教程:手把手教你从下载到激活(附详细步骤图)

本文详细介绍了BarTender 2021专业版的安装与高效应用指南,从基础配置到高级条码设计,帮助用户快速掌握标签设计与打印技术。内容涵盖安装步骤、标签模板创建、数据连接与批量打印技巧,以及高级功能如安全策略与自动化集成,适合零售、物流、制造等行业用户提升工作效率。

p4q5r6s7t的博客 2663

全局内存分配器:tcmalloc_sys_alloc

[TCMalloc] 全局内存分配器   TCMalloc 的全局分配器,处于 TCMalloc 的最底层,负责向操作系统申请和释放内存,接口有两个,定义在 src/system-alloc.h|.cc: extern void* TCMalloc_SystemAlloc(size_t bytes, size_t *actual_bytes,

weixin_36145588的博客 977

【史诗级】详细阐述借助AI实现对Windows蓝屏原因进行精确定位的方法

在解决问题的过程中我决定把这一切都记录下来,并整理出一套通用的方法,方便快速精确定位引起蓝屏的真实原因。今天我的蓝屏代码是0x000000ef,而你或许是遇到另一个蓝屏代码,代码本身代表的含义不是这里的讨论重点,重要的是解决问题的底层逻辑。

sprlightning的博客 1万+

linux-glibc内存管理小结1(ptmalloc源码分析)

之前写过关于内存管理的几篇文章, 但是比较零碎, 网上很多文章又偏于理论或者局限一块内容, 少有一个系列的分析. 一直想自己写个, 正好借助这次培训机会写篇文章, 从源码分析申请内存之后到实际访问内存之间系统究竟做了什么, 探讨一下源码作者如此设计内存管理模块的目的与意义. 暂时规划分四部分完成: glibc堆内存管理 内核如何管理虚拟地址空间 虚拟内存与物理内存的映射 内核如何处理内存地址异常 ...

weixin_34301132的博客 390

泰山派rk3566 audio音频基础介绍

本文介绍了嵌入式系统中音频处理的基础知识,重点围绕RK3566平台的音频子系统展开。文章首先解释了音频信号从模拟到数字的转换过程,包括采样率、位深和声道等核心概念。随后详细分析了嵌入式音频开发中的关键接口:I2C用于控制音频编解码器,I2S作为专用音频数据传输总线,以及PCM作为原始音频格式和ALSA设备抽象的双重含义。通过对这些基础概念和接口的解析,为在RK3566平台上进行音频驱动开发和应用调试提供了理论基础。

qq_37077309的博客 295

手把手教你完成YOLOv11分类识别界面搭建,使用Qt6设计YOLOv11分类识别系统,前台系统+后台管理系统开发实战,全网最详细教程

本项目结合YOLOv11分类识别算法和PySide6框架,开发了一套图形化分类识别系统。系统支持图片、视频和摄像头实时分类检测,并具备完善的用户管理功能,包括登录验证、个人信息修改等模块。最新版本新增了管理员后台管理系统,包含用户管理、权限控制等功能。系统采用MySQL数据库存储用户数据,界面设计采用QtDesigner完成,实现了高效的目标分类与友好的交互体验。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1054

dlmalloc学习

为什么80%的码农都做不了架构师?>>> ...

weixin_34126215的博客 143

深度学习之目标检测--Pytorch实战

只需要能看懂python代码,就能最快入门深度学习---目标检测。目标检测简单的玩玩儿还行,模型调优,调参,还需要一定的数学功底。通过代码来实现卷积,池化,非线性激活,正则化,归一化,能让人减少对大量数学公式的敬畏,手写神经网络也是考研复试中上机考试的压轴题,掌握搭建神经网络和如何训练模型是需要掌握的基础的

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 1万+

dlmalloc 2.8.6 源码详解(3)

前面介绍过, dlmalloc将小于256字节的内存划分为small chunk, 256字节以上的划分为tree chunk.对这两种chunk的管理也采用不同方式. small chunk使用small bins管理,采用更精确的标记方法,而tree chunk用tree bins管理,较之使用相对粗放的管理方式.这种划分方法基于这样一种经验性的认知,即小块内存总是连续而频繁的分配,因此需要更加精确匹配,否则将产生时间和空间上的缺失,相反大块内存则往往一次性的分配,由此产生的代价和浪费相对较低.

vector03的专栏 3484

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

dlmalloc 2.8.6 源码详解(5)

本章节介绍dlmalloc的分配算法和实现. 由于存在多mspace的情况, dlmalloc使用了两套API. 一套对应默认的mspace, 以dl前缀开头, 如dlmalloc, dlrealloc等. 如果创建了自定义的mspace, 则使用mspace开头的API, 如mspace_malloc, mspace_realloc等. 但两套API在基础算法上是一致的. 我们就以默认的API为主要对象介绍.

vector03的专栏 3588

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

dlmalloc 2.8.6 源码详解(2)

本文章由vector03原创, 转载至[vector03](https://blog.csdn.net/vector03/article/details/40979181)这就保证了两种类型在基础结构上具有较好的兼容性。这个结构体中间填充多长的内容是没法确定的。的作用是将连续内存划分为一段段小的区块。将用户请求的内存值转化成实际的内部大小。与前者的区别在于管理上使用不同的结构。源码中定义了大量的宏来对其进行操作。的源码中有一幅用字符画成的示意图。在上一节的图中并没有画出对应的。

firebuffer的专栏 176

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

dlmalloc 2.8.6 源码详解(1)

本文章由vector03原创, 转载请注明出处. 邮箱地址

vector03的专栏 9367

dlmalloc 2.8.6 源码详解(4)

在dlmalloc的内部结构中,除了基础的chunk外,还存在一种粒度更粗的结构,称为区段(segment). 之所以需要额外引入这种数据结构是为了提升对非连续内存的管理能力. dlmalloc将连续内存划分到一个segment中管理,而段与段之间则是不连续的,所有的段都由一个mspace统一去管理.如果用户程序创建了多个mspace,这些mspace内部包含的segment有可能在地址上连续,但实际归属于不同的空间.

vector03的专栏 3947

dlmalloc 2.8.6 源码详解—[5]释放及实现

转载自:vector034 释放与实现释放过程相对分配就简单多了, 基本着重在chunk合并, top裁剪, segment释放上. dlmalloc中合并是减少外部碎片最有效的方法了.4.1 dlfree释放的主要过程就是根据用户传入的payload, 找到chunk指针, 然后分别检查前一个和后一个chunk是否可以合并. 这里唯一需要注意的就是与dv和top这些特殊chunk的交互.基本流程如

杏林小轩 738

dlmalloc 2.8.6 源码详解(7)

本文章由vector03原创, 转载至[vector03](https://blog.csdn.net/vector03/article/details/41314055)释放过程相对分配就简单多了基本着重在chunk合并, top裁剪, segment释放上. dlmalloc中合并是减少外部碎片最有效的方法了释放的主要过程就是根据用户传入的payload,找到chunk指针然后分别检查前一个和后一个chunk是否可以合并这里唯一需要注意的就是与dv和top。

firebuffer的专栏 105

dlmalloc 2.8.6 源码详解—[1]chunk

转载自:vector032 标记结构本章节将介绍基本的内存标记结构,包括chunk, tree chunk, sbin, tbin, segment, mstate等.这些重要的机构组成了dlmalloc分配算法的基础.2.1 chunkchunk是dlmalloc中最基本的一种结构,它代表了一块经过划分后被管理的内存单元. dlmalloc所有对内存的操作几乎都聚焦在chunk上.需要注意的是,

杏林小轩 1872
上一篇: dlmalloc 2.8.6 源码详解(5)
下一篇: dlmalloc 2.8.6 源码详解(7)
vector03
博客等级 码龄16年 62粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值