ngnix-内存管理(3)_一个博客id_新浪博客

内存的使用:
1.申请内存
2.释放内存
3.回收内存

上一讲说了内存池的创建、销毁以及重置,这讲要说内存池在被创建好后,是如何向内存池申请内存的,内存使用完又是如何将内存池归还给内存池循环使用的呢。


1.向内存池申请内存: 有三个方法
ngx_palloc ( )
ngx_pnalloc ( )
ngx_calloc    ( )

ngx_palloc_block( )  当没有内存可使用的时,将调用该函数开辟一个新节点来使用。
说一下这三个函数有什么区别以及不同的使用场景:

1.ngx_palloc ( ngx_pool_t *pool ,size_t size);
指定从哪个内存池分配内存,并且说明需要分配多大的空间。
然后将从p->current内存节点(小内存)开始遍历,直到找到一个节点可以满足,然后将内存的起始地址返回回去。
但是如果遍历完所有的节点,没有可以满足需求的节点,我们将调用ngx_palloc_block( )创建一个新的节点,开辟内存,然后将新的内存节点加入到内存池中。
但是如果新的内存池的节点还是不能满足用户的需求,说明申请的内存属于大内存(large),将从大数据链表上找一个合适的节点分配。
但是还有一种情况,对于遍历大块节点链表,如果在三次内遍历到的大数据节点为NULL,我们直接返回该数据部分的起始地址;如果ngx_pool_large_s上的节点数以及超过三个,我们将不往后遍历,直接申请一块ngx_large_pool_t的内存,建立一个新的节点,将节点插入到大块内存链表的最前面,并返回起始地址。
ngnix-内存管理(3)





2.ngx_pnalloc( )
和ngx_palloc ( ngx_pool_t *pool ,size_t size)基本一直,pnalloc是分配时不考虑内存对齐的问题


3.ngx_calloc( )

该函数实际上是对malloc的封装,是直接和系统申请内存,而不是在内存池申请内存。另外一点区分是使用该函数的申请的内存会进行清0。



2.释放内存:
最终不管哪个部分的内存,最终都是调用free函数释放。只不过是释放的时机不同而已。

简言之,内存使用完毕后,大块内存的释放真正的调用free归还给系统,而其余部分仅仅只是在表面的归还,实际还在内存池,真正的小数据部分的内存归还是在销毁的时候。


3.回收内存
在nginx服务器程序上,有些数据类型在回收其所占的内存资源时,不能直接通过释放内存空间的方式进行,而需要在释放空间前对数据进行指定的处理操作。该操作指的是cleanup指向的回调函数。

ngx_cleanup_add ( )用来给内存回收链表上添加需要回收的内存节点。


3.



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值