dpdk中的librte_malloc库

news2025/1/21 16:37:08

dpdk中的librte_malloc库提供了能够分配任意大小内存的API。

该库的目标是提供类似malloc的函数从hugepage中分配内存,以及帮助应用程序移植。

通常情况下,这种类型的分配不应该在数据平面处理,因为其比基于内存池的分配更慢,

并且在分配和释放时会使用锁。

不过,可以将其用在配置代码中。

4.1 Cookies

如果在配置文件中打开CONFIG_RTE_MALLOC_DEBUG,

分配的内存会包含覆盖保护区域,以识别缓冲区溢出问题。

4.2 对齐与NUMA Constraints

rte_malloc()函数包含一个align参数,用来要求内存区域对齐到该值的倍数(必须是2的倍数)。

在支持NUMA的系统中,调用rte_malloc()函数时,会在调用该函数的进程所在的socket上分配内存。

同时该库也提供了一组API,使用户可以直接在指定的NUMA socket上分配内存,

或者在另一个core所在的NUMA socket上分配内存。

4.3 用例

应用程序在初始化时使用类似malloc这样的函数时,可以使用该库。

要在运行时分配/释放内存数据,如果应用程序对速度有要求,

请用内存池库代替本库。

如果要使用一块需要知道物理地址的内存块,如硬件设备使用的内存块,

则应该使用memory zone。

4.4 数据结构

在malloc库的内部使用两种数据结构类型:

struct malloc_heap: 用来管理每个socket上的空闲空间

struct malloc_elem: 分配的基本元素,由库内部管理的空闲空间。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

4.4.1 struct malloc_heap

该结构体用来管理每个socket上的空闲空间。

在库的内部,每个NUMA node上包含一个 heap结构体,

使我们可以根据线程运行所在的NUMA node,在对应的结点分配内存。

虽然不能保存一定会在指定的结点上分配内存,但比总在某个固定的的结点或随机结点分配要好。

heap的关键成员变量和成员函数描述如下:

mz_count: 保存本结点已经为heap内存分配的memory zone的数量。该值的唯一用途就是与numa_socket值组合为每个memory zone生成一个唯一的名字。

lock: 该变量用来做对heap访问的同步。考虑到heap中的空闲空间是由一个list管理的,所以我们需要一个锁来防止两个线程同时访问该list。

free_head: 该变量该malloc heap的free nodes list中的第一个元素。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

注意: malloc_heap结构体不会管理已经分配的memzones,这么做是毫无意义的,因为它们不会被释放。

也不会管理使用中的内存块,因为除非它们被释放,否则是不会再次接触到这些内存块的。

在释放时,指向这些内存块的指针会作为free()函数的参数。

 

4.4.1.2 struct malloc_elem结构体

malloc_elem结构体被用作memzone中各种内存块的头部结构。

有三种不同的用法:

1、分配或释放内存块时的头部 - 普通情况

2、在内存块中作为padding头部

3、作为memzone结尾处的标记

下文描述了结构中最重要的部分以及用法。

注意:如果某种用法不属于上面描述的三种中的任何一种,则认为对应的变量是未定义的。

例如,只有当"state"和"pad"两个变量的值是有效值是,才认为其是一个padding header。

head:该指针是已经分配的内存块中指向heap结构的反向引用,即指向对应的heap。

        普通内存块在释放时会使用该指针,将当前释放的内存块添加到heap的free list中。

prev:该指针指向memzone中当前内存块紧前面的内存块的header element/block。

        当释放一个内存块时,该指针用来引用前一个内存块,看其是否也需要释放。

        如果需要,则两块内存组合成一块更大的内存块。

next_free:该指针用来将未分配的内存块链接到一起。

        同样,该变量只在普通内存块中使用,在malloc()函数中找到一块符合需求的内存块来分配,

        并且在调用free()函数将新释放的内存添加到free-list中。

state:该变量可以是以下三个值之一:“Free”, “Busy”或“Pad”。

        前两个用业表示普通内存块的分配状态,

        第三个用来表示在start-of-block padding的结尾处的元素结构体是一个dummy结构体。

        (例如,由于强制对齐,内存块中数据的开始处不在内存块中。???)

        在这种情况下,pad header用来定位实际分配的元素header。

        对于end-of-memzone结构体,该值总是“busy”,

        以确保在释放时没有元素为了整合成一个更大的内存块,而在memzone的结尾外面查找其它内存块。

pad:该变量保存内存块开始处的padding区域的长度。

        如果是普通内存块header,该值会被加到header的结尾处的地址,以给出数据区域的正确地址。

        例如,在调用malloc函数时传回的值。

        在padding中的dummy header的内部,该值也会被保存,

        and is subtracted from the address of the dummy header to yield  the address of the actual block header.

size:表示数据内存块的大小,包含header自身。对于end-of-memzone结构,该值为0,虽然从不会检查该值。

        对于被释放的普通内存块,该值用来代替“next”指针,用来计算下一个内存块所在的地址。

        (因此如果下一个内存块也是free的,两个内存块可以整合成一个)。

4.4.2 内存分配

应用程序调用类似malloc的函数时,malloc函数首先会根据调用线程索引lcore_config结构,

以及根据该线程确定其所在的NUMA结点。

即用来索引malloc_head结构数组,之后以该数组为参数调用heap_alloc()函数,

同时作为参数的还有要分配的大小,类型和对齐。

heap_alloc()函数会扫描heap的free_list,并尝试找到一个合适大小的内存块来存储数据,同时强制对齐。

如果没有找到合适大小的内存块,例如,第一次在某结点上调用malloc函数时free-list是空的,

则会创建一个新的memzone并配置为heap元素,其会将一个dummy结构放置到memzone的结尾处,

作为一个标记,防止访问超出这块内存之外(由于该标记被置为“BUSY”,malloc库永远无法将这块内存分配出去)。

同时在memzone的开始处放置一个合适的element header。这个header标记了memzone中的所有空间,

bar the sentinel value at the end,end, as a single free  heap element, and it is then added to the free_list for the heap.

新的memzone配置好之后,会重新对heap的free-list进行描述,这次描述会找到新添加的合适大小的元素,

将其作为memzone中保留内存的大小,至少是调用函数中指定的大小的数据内存块加上对齐,

至少是Intel DPDK运行时配置中指定的最小大小。

找到一个合适大小的空闲元素之后,会计算返回到用户的指针,包含提供给用户的空闲内存块结尾处的空间。

紧跟着这块内存的cache-line被填充一个struct malloc_elem头:

如果内存块中余下的空间比较小,如<=128字节,就会使用一个pad header,余下的空间就浪费了。

不过,如果余下的空间大于128字节,则这块空闲内存块就被分成两份,

一个新的,合适的malloc_elem头被放到返回的数据空间之前。

从已经存在的元素的结尾分配内存的好处是,在这种情况下,不需要调整free list——

free list中已经存在的元素已经调整过尺寸指针了,后面element的“prev”指针已经重新指向这个新创建的element了。

4.4.3 释放内存

要释放内存,需要将指向数据区域起始地址的指针传递给free函数。

函数会从指针中减去malloc_elem结构的大小以获取内存块的element header。

如果header的类型是“PAD”,则再从指针中减去pad的长度。

从该element指针中,可以获取到指向堆的来源和需要释放到哪里的指针,

以及指向前一个元素的,并且通过size变量,可以计算下一个元素的指针。

之后也会检查后面的和前面的元素,看其是否也需要被释放。

这意味着永远不会发生两个空闲内存块相邻的情况,这样的内存块总是会被整合成一个更大的内存块。

原文链接:https://sysight.com/index.php?qa=20&qa_1=dpdk%E4%B8%AD%E7%9A%84librte_malloc%E5%BA%93

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

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

相关文章

网站被反诈中心DNS劫持解决教程

如果你的网站部分地区用户访问反馈访问不了&#xff0c;测试域名DNS被劫持到了127.0.0.1 或 0.0.0.0 可能是域名被墙了&#xff0c;或则被反诈中心拦截了&#xff0c;如果遇到该问题&#xff0c;需要检测单单被运营商拦截还是也有被反诈中心拦截。 排查过程: 可以把问题域名通过…

H5 雪碧图 移动的机器猫

精灵图&#xff08;英语&#xff1a;Sprite&#xff09;&#xff0c;又被称为雪碧图或拼合图。在计算机图形学中&#xff0c;当一张二维图像 集成进场景中&#xff0c;成为整个显示图像的一部分时&#xff0c;这张图就称为精灵图。 本文中用的就是这张&#xff0c;来自爱给网。…

Python:Flask简介与实践

文章目录简介一、简单使用二、调试模式三、路由四、路径变量五、构造URL六、HTTP方法七、静态文件八、模板生成九、日志输出十、处理请求1. Request 对象十一、文件上传十二、Cookies十三、重定向和错误十四、响应处理十五、Sessions十六、模板简介1. 模板标签2. 继承3. 控制流…

超高精度PID控制器的特殊功能(2)——远程操作软件及其安装使用

摘要&#xff1a;远程控制软件是高级PID调节器随机配备的一种计算机软件&#xff0c;可在计算机上远程进行调节器的所有操作&#xff0c;并还具有过程曲线显示和存储功能。本文主要针对VPC 2021系列超高精度PID控制器&#xff0c;介绍了随机配备的控制软件的安装和一些最基本的…

2022-12-21 Buildroot创建自己的软件包,把一个c应用编译到系统里面去运行

一、Buildroot 编译完成后&#xff0c;会在 /buildroot/output/xxxx/host/ 目录下&#xff0c;生成交叉编译工具&#xff0c;我们可以用来编译目标程序。 1、比如我现在要编译下面的c文件 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[…

分布式是大数据处理的万能药?

前言&#xff1a;分布式是大数据处理的万能药&#xff1f;今天叶秋学长跟大家一起探讨这个问题~ 使用分布式集群来处理大数据是当前的主流&#xff0c;将一个大任务拆分成多个子任务分布到多个节点进行处理通常能获得显著的性能提升。因此&#xff0c;只要发现处理能力不足就可…

人数超员识别系统 yolov5

人数超员识别系统基于计算机视觉分析技术yolov5网络架构对现场画面实时分析&#xff0c;如监测到区域超员时&#xff0c;立刻抓拍存档并告警提示。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0c;使其速度与精度都得到了…

Java日志技术是什么

文章目录日志技术日志技术介绍日志技术体系日志技术 日志技术介绍 想清楚的知道一个系统运行的过程和详情就需要日志记录 日志介绍: 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 程序中的日志&#xff1a; 程序中的日志可以用来记…

04---springboot实现增删改查

1、配置文件 application.yml server:port: 8081 spring:mvc:path match:matching-strategy: ant_path_matcherdatasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://localhost:3306/management?useUnicodetrue&use…

C++ STL 之关联容器 map 详解

文章目录Part.I AttentionChap.I 注意事项Chap.II 操作技巧Part.II FuncitonPart.III CodeChap.I mapChap.II unordered_mapChap.III multimapPart.I Attention C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的&#xff0c;每一对中的第一个值称之为关键…

博苑股份冲刺创业板上市:上半年净利润约1亿元,李成林为董事长

近日&#xff0c;山东博苑医药化学股份有限公司&#xff08;下称“博苑股份”或“博苑医药”&#xff09;在深圳证券交易所创业板更新招股书。据贝多财经了解&#xff0c;博苑股份于2022年6月17日递交招股书&#xff0c;准备在创业板上市。 本次冲刺创业板上市&#xff0c;博苑…

服务的消费方式和服务熔断

目录 1. 服务消费方式 1.1 RestTemplate 1.2 feign 2. 服务熔断&#xff08;降级&#xff09; 2.1 在微服务架构中服务熔断的必要性 健康的微服务集群&#xff1a; ​编辑 出现故障&#xff1a; ​编辑 系统雪崩&#xff1a; ​编辑 2.2 hystrix 2.3 hystrix的使用…

[Linux]多线程的同步和互斥(线程安全 | 互斥锁 | 死锁 | 条件变量)

文章目录Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口初始化互斥量销毁互斥量互斥量的加锁和解锁互斥量实现原理可重入vs线程安全常见线程不安全情况常见线程安全的情况常见不可重入的情况常见可重入的情况可重入与线程安全的联系可重入与线程安全的区别…

你易忽略的三极管电路问题1:下拉电阻

如下这个三极管共射极驱动电路中&#xff0c;B、E极之间的下拉电阻的作用&#xff1f;是否可以将其去除&#xff1f;该电阻有两个重要的作用&#xff1a;在驱动信号关闭时给三极管基极一个固定的电平。当驱动信号&#xff08;SIGNAL&#xff09;关闭时&#xff0c;若没有下拉电…

搭建Python环境(~保姆级别服务~)

文章目录前言一、搭建 Python 环境安装Python1. 找到官方网站2. 找到下载页面3. 双击安装包4. 运行 hello world安装PyCharm1. 找到官方网站2. 找到下载页面3. 双击安装包4. 运行 hello world创建一个项目选择项目所在的位置, 并选择使用的 Python 解释器.创建文件4. 编写代码5…

emoji与UTF-16、UCS-4、unicode的关系、原理和换算

emoji与UTF-16、UCS-4、unicode的关系、原理和换算 目录 emoji与UTF-16、UCS-4、unicode的关系、原理和换算 一、Unicode字符集概述 二、原理 1、UTF-16、UCS-4、unicode 2、emoji表情字符标准 3、关于肤色 一、Unicode字符集概述 https://en.wikipedia.org/wiki/Emoj…

【Python机器学习】标注任务与序列问题讲解(图文解释)

标注模型用于处理有前后关联关系的序列问题。在预测时&#xff0c;它的输入是一个观测序列&#xff0c;该观测序列的元素一般具有前后的关联关系。它的输出是一个标签序列&#xff0c;也就是说&#xff0c;标注模型的输出是一个向量&#xff0c;该向量的每个元素是一个标签&…

VScode ChatGPT 的中文插件安装使用

ChatGPT 的中文插件 由于官方服务对服务的封禁&#xff0c;大量国内代理服务全军覆没。开发者经过千辛万苦&#xff0c;找到了一个beta模型&#xff0c;目前作为 ChatGPT 正式服务上线前的过渡方案&#xff0c;供大家使用 插件安装后即处于”国内模式“&#xff0c;国内模式开…

艾美捷Annexin V-FITC凋亡检测试剂盒流式细胞术方案

FITC标记的重组人膜联蛋白V显示亮绿色荧光&#xff08;Ex&#xff08;max&#xff09;:488nm&#xff0c;Em&#xff08;max&#xff09;:530nm&#xff09;。 艾美捷Annexin V-FITC凋亡检测试剂盒化学性质&#xff1a; 应用&#xff1a;流式细胞术、荧光显微镜、荧光检测 应…

LncFinder | 非编码RNA的识别与分析神器!!!~

1写在前面 非编码RNA(ncRNAs), 是指不编码蛋白质的RNA。&#x1f617; 其中包括rRNA&#xff0c;tRNA&#xff0c;snRNA&#xff0c;snoRNA, lncRNA和miRNA等多种已知功能的RNA&#xff0c;还包括未知功能的RNA。&#x1f913; 长链非编码RNA&#xff08;lncRNA&#xff09;指的…