DPDK 内存管理(三)(rte_malloc 内存管理)
来源:互联网 发布:淘宝卖家版怎么登陆 编辑:程序博客网 时间:2024/05/29 14:33
转自:http://blog.csdn.net/xy010902100449/article/details/47283043
rte_malloc()为程序运行过程中分配内存,模拟从堆中动态分配内存空间。
1 void *2 rte_malloc(const char *type, size_t size, unsigned align)3 {4 return rte_malloc_socket(type, size, align, SOCKET_ID_ANY);5 }
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()在堆中,将需要分配的内存划分出去。
1 void * 2 malloc_heap_alloc(struct malloc_heap *heap, 3 const char *type __attribute__((unused)), size_t size, unsigned align) 4 { 5 if (!heap->initialised) 6 malloc_heap_init(heap); 7 8 size = CACHE_LINE_ROUNDUP(size); 9 align = CACHE_LINE_ROUNDUP(align);10 rte_spinlock_lock(&heap->lock);11 struct malloc_elem *prev, *elem = find_suitable_element(heap,12 size, align, &prev);13 if (elem == NULL){14 if ((malloc_heap_add_memzone(heap, size, align)) == 0)15 elem = find_suitable_element(heap, size, align, &prev);16 }17 18 if (elem != NULL){19 elem = malloc_elem_alloc(elem, size, align, prev);20 /* increase heap's count of allocated elements */21 heap->alloc_count++;22 }23 rte_spinlock_unlock(&heap->lock);24 return elem == NULL ? NULL : (void *)(&elem[1]);25 26 }
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减半,再次查找。
1 do {2 mz = rte_memzone_reserve(mz_name, mz_size, numa_socket,3 mz_flags);4 if (mz == NULL)5 mz_size /= 2;6 } while (mz == NULL && mz_size > min_size);
find_suitable_element():在堆中找到一块合适大小的内存,分配的内存是从堆的底部开始查找的。如果堆剩余内存不够分配的,会再次调用malloc_heap_add_memzone()扩展堆的大小。
malloc_elem_alloc():查找到合适大小的内存块后,将这一块内存从堆中划分出去。
还是直接上图直接点。。。。
- DPDK内存管理 -----(三)rte_malloc
- DPDK 内存管理(三)(rte_malloc 内存管理)
- DPDK 内存管理(三)(rte_malloc 内存管理)
- DPDK(13):rte_malloc内存管理
- DPDK 内存管理(二)(rte_mempool 内存管理)
- DPDK 内存管理(二)(rte_mempool 内存管理)
- DPDK内存管理-----(一)初始化
- DPDK内存管理 -----(一)初始化
- DPDK内存管理 -----(二)rte_mempool
- DPDK内存管理-----(四)rte_mbuf
- DPDK(12):rte_mempool内存管理
- dpdk内存管理
- DPDK 内存管理(一)(内存初始化)
- DPDK 内存管理(一)(内存初始化)
- dpdk内存管理之内存分配器(堆分配)
- DPDK之(六)——内存管理
- DPDK之(十一)——内存管理---rte_mbuf
- DPDK内存管理 ----- (四) rte_mbuf
- LVS同步连接状态信息(IPVS Connection Synchronization)
- linux应用开发基础(一)GCC编译器、动态库、静态库使用
- HDU 2222 Keywords Search(AC自动机)
- bash: 一键安装Chrome
- hdu 5945 单调队列优化的DP
- DPDK 内存管理(三)(rte_malloc 内存管理)
- Markdown编辑器改变颜色
- margin和padding属性特点
- C#ASP.MVC后台怎么取前台AJAX传到后台的普通数组。
- 51nod1110 距离之和最小 V3
- python 读取文件注意事项
- Ubuntu 14.04 安装 CUDA8.0 cudnn 5.1 tensorflow1.2.1GPU
- 实现无缝轮播
- Appium简介以及工作原理