499-nginx内存池(重置函数和小块内存回收)

重置函数

在这里插入图片描述

释放函数

在这里插入图片描述
但是这个释放内存的函数仅仅是给大块内存调用的。为什么小块内存不用释放内存???

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空间配置器内存池 适合所有场景,因为它的小块和大块都是有内存开辟和内存释放的方法的接口的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值