内存池重置函数
Nginx
中只有释放大块内存而没有释放小块内存的函数;
Ngnix则是只提供了内存池重置函数ngx_reset_pool
,假如重置内存池p函数流程如下:
- 释放大块内存
- 释放所有小块内存,即将
p->d.last
指针移动到内存池的最开始位置 - 将当前池设置为指向自己本身
代码如下
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
给客户端返回一个response
,http
就主动断开TCP链接(http 1.1 keep-alive:60s)
http服务器(nginx)返回响应后需等待60s,60s之内客户端又发来请求,重置这个时间,否则60s之内没客户端发来响应,ngnix就主动断开连接,此时nginx可调用ngx_reset_pool
重置内存池,等待下一次该客户端请求