nginx内存池原理

1 nginx内存池介绍

内存池实现原理主要分为分配,回收,扩容三部分。nginx内存池实现也是这样的。
对于nginx而言,内存池是分等级的,启动时每创建一个worker进程就会分配一个进程级内存池,当客户端有一个连接(http,tcp,udp等)连上后就会在当前的进程级内存池在分配创建一个连接级内存池,在这个连接中客户端request一个请求时,会在连接级内存池中分配创建一个请求内存池;服务器与这个连接的所有操作都是在对应的内存池中处理,如果客户端断开连接后,服务器就会释放对应的内存池.
大体逻辑
Nginx的内存池的使用主要是在各个连接到达之后为每个连接单独开辟一个内存池,在连接关闭后释放这个内存池
1 请求 nginx中一个http,tcp,udp请求再服务器这边就会创建一个对应的内存池,对这个请求操作,就找对应的这个内存池操作就好
2 分配nginx分配内存区分大块内存,小块内存;当小于pool->max时候就是再内存池中分配内存,如果内存池空间不够,则需要开新的快来处理;
申请的空间大于pool->max时候,就直接malloc开辟然后挂载到pool->large链表下面
3 释放 在释放内存时,nginx 没有专门提供针对释放小块内存的函数,小块内存会在 ngx_destory_pool 和 ngx_reset_pool 的时候一并释放。
内存分配逻辑
分配一块内存,如果分配的内存 size 小于内存池的 pool->max 的限制,则属于小内存块分配,走小内存块分配逻辑;否则走大内存分配逻辑。小内存分配逻辑:循环读取 pool->d 上的内存块,是否有足够的空间容纳需要分配的 size,如果可以容纳,则直接分配内存;否则内存池需要申请新的内存块,调用 ngx_palloc_block。
大内存分配逻辑:
当分配的内存 size 大于内存池的 pool->max 的限制,则会直接调用 ngx_palloc_large 方法申请一块独立的内存块,并且将内存块挂载到 pool->large 的链表上进行统一管理。

2 数据结构

区分大块,小块,cleanup机制

// cleanup结构
typedef void (*ngx_pool_cleanup_pt)(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丰恒谷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值