lwip-動態內存管理

動態內存管理涉及兩類重要函數,內存分配函數,內存釋放函數,如C語言中的malloc和free.

  內存分配的本質是:在事先準好一大塊內存堆(可以理解爲一個很大的數組)中分配合適的空間,然後將該空間起始地址返回給調用者,內核必須採用自己獨有的一套數據結構來描述,記錄那些空間範圍已經被分配(稱之爲佔用塊),哪些未用(稱之爲空閒塊),而根據這裏採用的機制的不同,就會延伸出多種類型的內存分配策略。  

常見內存分配策略

1,系統規定用戶在申請內存時,申請大小必須指定爲某幾個固定值,否則內存分配函數不予分配。稱之爲動態內存池分配。適用於TCP首部,IP首部。-動態內存池分配

2,分配策略與第一種很相似,初始化幾個固定大小的內存塊鏈表,不同鏈表的空間大小不一,如申請5個字節時,系統在包含較小字節的鏈表中去查找空閒空間。

3,系統運行時,各個空閒塊的大小是隨着系統運行而改變的,即可變長度內存分配。

a.首次擬合-動態內存堆分配,分配時查詢空閒鏈表,回收時只用將空閒塊插到表頭;

b.最佳擬合,適用於用戶請求大小範圍較廣的系統。分配和回收都需要查找鏈表,最浪費時間;

c.最差擬合,適用於用戶內存請求大小範圍較窄的系統。分配時不需要查找,回收時需要查找空閒鏈表。

存儲緊縮操作

動態內存池管理

                            表 6­1 動態內存池管理相關數據結構

名稱 類型 所在文件 描述
memp_t 枚舉型數據類型 memp.h 爲每類 POOL 定義一個名稱/編號
memp_tab[] 全局型指針數組 memp.c 指向每類 POOL 中的第一個 POOL
memp_sizes[] 全局型數組 memp.c 每類 POOL 中單個 POOL 的大小
memp_num[] 全局型數組 memp.c 每類 POOL POOL 的個數
memp_desc[] 全局型指針數組 memp.c 指向每類 POOL 的描述字符串
memp_memory[] 全局型數組 memp.c 爲所有 POOL 分配的內存空間

 

typedef enum {
#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name,
#include "lwip/memp_std.h"
MEMP_MAX
} memp_t;
//爲每類POOL定義一個名詞/編號

當memp_std.h編譯完後,memp_t就建立起來了,其內容如下:

typedef enum {
MEMP_ RAW_PCB,
MEMP_ UDP_PCB,
MEMP_ TCP_PCB
MEMP_ TCP_PCB_LISTEN,
MEMP_ TCP_SEG,
……
MEMP_MAX
} memp_t;

相關定義查看memp_std.h,memp.c等文件。

動態內存堆管理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章