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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值