動態內存管理涉及兩類重要函數,內存分配函數,內存釋放函數,如C語言中的malloc和free.
內存分配的本質是:在事先準好一大塊內存堆(可以理解爲一個很大的數組)中分配合適的空間,然後將該空間起始地址返回給調用者,內核必須採用自己獨有的一套數據結構來描述,記錄那些空間範圍已經被分配(稱之爲佔用塊),哪些未用(稱之爲空閒塊),而根據這裏採用的機制的不同,就會延伸出多種類型的內存分配策略。
常見內存分配策略
1,系統規定用戶在申請內存時,申請大小必須指定爲某幾個固定值,否則內存分配函數不予分配。稱之爲動態內存池分配。適用於TCP首部,IP首部。-動態內存池分配
2,分配策略與第一種很相似,初始化幾個固定大小的內存塊鏈表,不同鏈表的空間大小不一,如申請5個字節時,系統在包含較小字節的鏈表中去查找空閒空間。
3,系統運行時,各個空閒塊的大小是隨着系統運行而改變的,即可變長度內存分配。
a.首次擬合-動態內存堆分配,分配時查詢空閒鏈表,回收時只用將空閒塊插到表頭;
b.最佳擬合,適用於用戶請求大小範圍較廣的系統。分配和回收都需要查找鏈表,最浪費時間;
c.最差擬合,適用於用戶內存請求大小範圍較窄的系統。分配時不需要查找,回收時需要查找空閒鏈表。
存儲緊縮操作
動態內存池管理
表 61 動態內存池管理相關數據結構
名稱 | 類型 | 所在文件 | 描述 |
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等文件。
動態內存堆管理