Nginx內存管理

這裏寫圖片描述

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函數,清理數據
釋放所有大塊內存
釋放所有內存池中的內存塊

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