DPDK内存管理 -----(三)rte_malloc

rte_malloc()为程序运行过程中分配内存,模拟从堆中动态分配内存空间。


void *rte_malloc(const char *type, size_t size, unsigned align)
{
  return rte_malloc_socket(type, size, align, SOCKET_ID_ANY);
}


rte_malloc()函数调用关系如下图:




rte_malloc_socket():

指定从哪个 socket 上分配内存空间,默认是指定 SOCKET_ID_ANY,即,程序在哪个socket上运行,就从哪个 socket 上分配内存。

如果指定的 socket 上没有合适的内存空间,就再从其它 socket 上分配。

 

malloc_heap_alloc():

从 rte_config.mem_config->malloc_heaps[] 数组中找到指定socket对应的堆(使用 struct malloc_heap 描述堆),即,从这个堆中分配空间。

如果该堆是第一次使用,还没有被初始化过,则调用 malloc_heap_init() 初始化;

首先,调用 find_suitable_element() 在堆中查找是否有合适内存可以分配,如果没有,则调用 malloc_heap_add_memzone() 在 rte_config.mem_config->memzone[] 中给堆分配一块内存。

最后,调用 malloc_elem_alloc() 在堆中,将需要分配的内存划分出去。

 

void * malloc_heap_alloc (struct malloc_heap *heap,

const char *type __attribute__((unused)),  size_t size,  unsigned align)

{

   if (!heap->initialised)

     malloc_heap_init(heap);

     size = CACHE_LINE_ROUNDUP(size);

     align= CACHE_LINE_ROUNDUP(align);

     rte_spinlock_lock(&heap->lock);

     struct malloc_elem *prev, *elem = find_suitable_element(heap, size, align, &prev);

     if (elem == NULL){

       if ((malloc_heap_add_memzone(heap, size, align)) == 0)

         elem = find_suitable_element(heap, size, align, &prev);

    }

 

   if (elem != NULL) {

     elem = malloc_elem_alloc(elem, size, align, prev);

     /* increase heap's count of allocated elements */

     heap->alloc_count++;

    }

   rte_spinlock_unlock(&heap->lock);

   return elem == NULL ? NULL : (void *)(&elem[1]);

}


malloc_heap_init():

主要是为struct malloc_heap数据结构的各个成员变量赋初始值,并将该堆的状态设置为INITIALISED。


malloc_heap_add_memzone():

调用rte_memzone_reserve(),在rte_config.mem_config->memzone[]中分配合适大小的内存。

分配的内存的大小是 mz_size = MAX(min_size, 11M),其中,min_size =size + align + MALLOC_ELEM_OVERHEAD * 2; size是rte_malloc()指定的需要分配内存的大小。

如果 memzone[] 中没有合适的内存块,将mz_size减半,再次查找。


do {
  mz = rte_memzone_reserve(mz_name, mz_size, numa_socket, mz_flags);
  if (mz == NULL)
  mz_size /= 2;
} while (mz == NULL && mz_size > min_size);


find_suitable_element():

在堆中找到一块合适大小的内存,分配的内存是从堆的底部开始查找的。如果堆剩余内存不够分配的,会再次调用malloc_heap_add_memzone()扩展堆的大小。


malloc_elem_alloc():

查找到合适大小的内存块后,将这一块内存从堆中划分出去。




文章来源

http://www.cnblogs.com/MerlinJ/p/4092432.html

除了 rte_malloc_heap_dump() 函数之外,DPDK 还提供了其他一些 API 来统计内存使用情况,包括: 1. rte_malloc_stats():该函数可以获取 DPDK 内存池的统计信息,包括内存池中的对象数量、空闲对象数量、已分配对象数量等等,可以用于监视内存池的使用情况。 2. rte_malloc_validate():该函数可以验证指定地址是否在 DPDK 内存堆中,如果地址无效,函数返回值为负数。 3. rte_malloc_dump_heaps():该函数可以打印所有非空 DPDK 内存堆的使用情况,包括内存堆的名称、总大小、已分配大小、剩余大小等等。 下面是一个简单的例子,展示了如何使用这些函数来统计 DPDK 内存使用情况: ```c #include <stdio.h> #include <rte_malloc.h> int main(int argc, char **argv) { // 初始化 DPDK 环境 rte_eal_init(argc, argv); // 分配一块内存 void *mem = rte_malloc(NULL, 1024, 0); if (mem == NULL) { printf("Failed to allocate memory!\n"); return -1; } // 输出内存使用情况 struct rte_malloc_stats stats; rte_malloc_stats(&stats); printf("DPDK memory stats:\n"); printf("Total heap size: %lu bytes\n", stats.total_heap_size); printf("Free heap size: %lu bytes\n", stats.free_heap_size); printf("Allocated heap size: %lu bytes\n", stats.allocd_heap_size); printf("Total allocated objects: %lu\n", stats.alloc_count); printf("Total freed objects: %lu\n", stats.free_count); // 验证指定地址是否在内存堆中 if (rte_malloc_validate(mem) < 0) { printf("Invalid memory address!\n"); } // 输出所有内存堆的使用情况 rte_malloc_dump_heaps(stdout); // 释放内存 rte_free(mem); return 0; } ``` 在上述代码中,我们首先使用 rte_eal_init() 函数初始化 DPDK 环境,然后使用 rte_malloc() 函数分配了一块 1024 字节的内存。接着,我们使用 rte_malloc_stats() 函数获取 DPDK 内存池的统计信息,并将其打印到标准输出中。然后,我们使用 rte_malloc_validate() 函数验证分配的内存地址是否有效。最后,我们使用 rte_malloc_dump_heaps() 函数打印所有非空 DPDK 内存堆的使用情况,将结果输出到标准输出中。最后,我们使用 rte_free() 函数释放了分配的内存。 当运行该程序时,屏幕上将输出类似以下的信息: ``` DPDK memory stats: Total heap size: 268435456 bytes Free heap size: 267435392 bytes Allocated heap size: 1021064 bytes Total allocated objects: 1 Total freed objects: 0 DPDK memory heap Heap name: rte_malloc_heap Total size: 268435456 bytes Free size: 267435392 bytes Free blocks: 2 Allocated blocks: 3 Minimum alloc size: 64 bytes Maximum alloc size: 268435392 bytes Total allocations: 1024 bytes Total frees: 0 bytes ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值