DPDK(13):rte_malloc內存管理

轉自:http://www.cnblogs.com/MerlinJ/p/4092432.html,用於個人記錄學習


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。


發佈了24 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章