Nginx内存管理

来源:互联网 发布:咏春拳可以自学吗 知乎 编辑:程序博客网 时间:2024/05/16 18:49

这里写图片描述

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

0 0
原创粉丝点击