重置函数
释放函数
但是这个释放内存的函数仅仅是给大块内存调用的。为什么小块内存不用释放内存???
nginx的小块内存是无法释放的,因为这个小块内存的分配都是通过last指针偏移的
如果1和3分配出去了,正在使用,2不使用了,2怎么归还到小块内存里?在这里,标识空闲内存就使用了2个指针,last和end。不可能现在把2这块内存给拉进去空闲内存空间里面。
小块内存不带回收,如果不带回收的话,小块内存随着分配越来越大,系统的内存肯定是分配失败,这该怎么考虑???
我们分析内存池重置函数
两个for循环,第一个for循环在遍历大块内存,
遍历large链表,l->alloc如果不为空,就把大块内存释放掉。重置,就是回到原来的状态,把alloc挂的大块内存全部free掉。
第二个for循环在遍历小块内存,p从pool(第一块小块内存)开始,从第一个内存块开始,然后把小块内存池连接起来,这个for循环做的不太正确。
因为第一个内存块的结构是这样的:
这样没错。但是后面的内存池只有这部分:
没有内存管理的数据域了。
后面的内存池的last应该归还到绿色的下方。
源码写的也不算错,只是浪费了前面的一些内存空间。
我们应该这么写:比较好
这样就重置了。current指向第一个。都复位了。
nginx内存池的总结
小块内存:web服务器间歇性(基于短连接)提供服务的应用场景。
服务处理完了,请求处理完了,这次服务的资源就都可以释放了。调用重置函数。
如果是长连接,客户端只要没有发起TCP挥手,那么这个连接就一直保持,不能释放,这样的场景时候SGI STL的二级空间配置器的内存池,因为它都有内存开辟和释放。
但是nginx的小块内存分配效率大于SIG STL的二级空间配置器的小块内存。因为直接通过指针偏移就分配成功了。太简单了。
短链接,所有资源释放,nginx内存池的复用!!!但是nginx内存池不适合长连接,因为内存池不能复用了,会把内存资源耗尽。
SGI STL空间配置器内存池 适合所有场景,因为它的小块和大块都是有内存开辟和内存释放的方法的接口的。