zoukankan      html  css  js  c++  java
  • DPDK内存管理-----(三)rte_malloc内存管理

    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():查找到合适大小的内存块后,将这一块内存从堆中划分出去。

    还是直接上图直接点。。。。

    错误之处,欢迎指正。

    转载请标注转自http://www.cnblogs.com/MerlinJ/p/4092432.html。

  • 相关阅读:
    redis应用场景
    redis 持久化
    vue.jsv-if 的key值问题
    laravel 上线注意事项 (ubuntu lamp)
    laravel 不同表用户登录,后台跳转问题
    Laravel 5.5 不同用户表登录认证(前后台分离)
    记录laravel 数据填充问题
    Git 版本控制器详解
    Ubuntu Apache多站点配置
    Spring的注解@Qualifier小结
  • 原文地址:https://www.cnblogs.com/MerlinJ/p/4092432.html
Copyright © 2011-2022 走看看