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函数,清理数据
释放所有大块内存
释放所有内存池中的内存块

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