ngx_pool_t:
typedef struct ngx_pool_s ngx_pool_t;
struct ngx_pool_s { // 內存池的管理分配模塊
ngx_pool_data_t d; // 內存池的數據塊
size_t max; // 數據塊大小,小塊內存的最大值
ngx_pool_t *current; // 指向內存池可用數據塊
ngx_chain_t *chain; // 該指針掛接一個ngx_chain_t結構
ngx_pool_large_t *large; // 指向大塊內存分配,nginx中,大塊內存分配直接採用標準系統接口malloc
ngx_pool_cleanup_t *cleanup; // 析構函數,掛載內存釋放時需要清理資源的一些必要操作
ngx_log_t *log; // 內存分配相關的日誌記錄
};
ngx_pool_data_t:
typedef struct { // 內存池的數據結構模塊
u_char *last; // 當前內存分配結束位置,即下一段可分配內存的起始位置
u_char *end; // 內存池的結束位置
ngx_pool_t *next; // 鏈接到下一個內存池,內存池的很多塊內存就是通過該指針連成鏈表的
ngx_uint_t failed; // 記錄內存分配不能滿足需求的失敗次數,當失敗次數大於指定值時 current 指向下一內存池單元
} ngx_pool_data_t; // 結構用來維護內存池的數據塊,供用戶分配小塊內存使用。
Nginx的內存池分爲兩個部分,一種是小塊內存,一種是大塊內存。小塊內存指的是last所指向的位置,大塊內存則需要重新開闢,由large指向。在需要開闢新的內存時,當傳入內存大小大於max值時,在large中查找(如果向後查三個都沒有找到合適的內存塊,則開闢新的內存塊並加入鏈表),反之,在last所指內存中查找。當小塊內存不夠時,會開闢新的內存塊,由next指針指向。
當需要銷燬內存時,大塊內存直接用ngx_free釋放,小塊則不做處理,只有在銷燬整個內存池時纔會處理。
內存池的銷燬步驟:
調用所有cleanup函數,清理數據
釋放所有大塊內存
釋放所有內存池中的內存塊