内存的使用:
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的内存,建立一个新的节点,将节点插入到大块内存链表的最前面,并返回起始地址。
2.ngx_pnalloc( )
和ngx_palloc ( ngx_pool_t *pool ,size_t size)基本一直,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.