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/虚拟化/高性能专家-学习视频教