nginx源码那些事之内存管理模块一

         nginx主要使用内存池进行内存管理,nginx中从内存池中分配内存的大小为NGX_MAX_ALLOC_FROM_POOL,为ngx_pagesize - 1,其中ngx_pagesize的大小在操作系统中为4095.

        nginx中主要的内存管理函数:

        1.创建内存池(ngx_create_pool() )

           调用ngx_memalign(NGX_POOL_ALIGNMENT, size, log)函数来分配内存,使用内存对齐的方式,以16字方式对齐;

           初始化ngx_pool_data_t的一些数据,如last,end,next,和ngx_pool_t的current,large,chain,cleanup变量

       2.销毁内存池(ngx_destroy_pool)

          首先销毁内存池中的ngx_cleanup_t,遍历pool的cleanup析构函数;

          然后销毁内存池中的大块内存,使用ngx_free()函数进行打开内存销毁;

          然后依次销毁内存池;调用pool->next指针进行遍历销毁;

  1. for (c = pool->cleanup; c; c = c->next) {
  2. if (c->handler) {
  3. ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
  4. "run cleanup: %p", c);
  5. c->handler(c->data);
  6. }
  7. }
  8. //前面讲到,cleanup指向析构函数,用于执行相关的内存池销毁之前的清理工作,如文件的关闭等,
  9. //清理函数是一个handler的函数指针挂载。因此,在这部分,对内存池中的析构函数遍历调用。
  10. for (l = pool->large; l; l = l->next) {
  11. ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
  12. if (l->alloc) {
  13. ngx_free(l->alloc);
  14. }
  15. }

       3.重置内存池(ngx_reset_pool

         对于初始分配的内存池,没有大块的内存池,而且last的大小增加sizeof(ngx_pool_t)的大小;

         函数使用ngx_free函数释放大块内存,然后重新设置last值。

    

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值