Nginx内存池(四)——重置函数和小块内存回收策略

内存池重置函数

Nginx中只有释放大块内存而没有释放小块内存的函数;

Ngnix则是只提供了内存池重置函数ngx_reset_pool,假如重置内存池p函数流程如下:

  1. 释放大块内存
  2. 释放所有小块内存,即将p->d.last指针移动到内存池的最开始位置
  3. 将当前池设置为指向自己本身

代码如下

void
ngx_reset_pool(ngx_pool_t *pool)
{
    ngx_pool_t        *p;
    ngx_pool_large_t  *l;

    for (l = pool->large; l; l = l->next) {
        if (l->alloc) {
            ngx_free(l->alloc);
        }
    }

    // 源码
    // for (p = pool; p; p = p->d.next) {
    //     p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    //     p->d.failed = 0;
    // }
    // 为了保证完全释放干净,第二块到结尾的块释放内存池
    // 把指针移动ngx_pool_data_t成员后即可
    // 处理第一块内存池
    p = pool;
    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    p->d.failed = 0;

    for (p = p->d.next; p; p = p->d.next) {
        p->d.last = (u_char *) p + sizeof(ngx_pool_data_t);
        p->d.failed = 0;
    }


    pool->current = pool;
    pool->chain = NULL;
    pool->large = NULL;
}

大块内存分配提供了ngx_pfree释放函数,为什么Nginx小块内存分配没有提供对应的释放函数?

原因是应用场景的问题,nginx是一个http服务器,是一个短链接服务器,客户端发起一个request请求,到达nginx服务器后,nginx给客户端返回一个responsehttp就主动断开TCP链接(http 1.1 keep-alive:60s)

http服务器(nginx)返回响应后需等待60s,60s之内客户端又发来请求,重置这个时间,否则60s之内没客户端发来响应,ngnix就主动断开连接,此时nginx可调用ngx_reset_pool重置内存池,等待下一次该客户端请求

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值