Nginx内存池的一些理解

内存管理中为避免内存碎片,nginx管理内存技术在此理解:
结构图如下:
一、内存池的数据结构
在nginx内存池中有一个头部,头部里又包含一个数据部,数据部主要用来为用户分配小块内存。数据部之外主要为用户分配大块内存、管理外部资源、日志信息以及内存池的一些其他信息。
在这里插入图片描述
ngx_pool_s的ngx_pool_data_t中:
last:是一个unsigned char 类型的指针,保存的是/当前内存池分配到末位地址,即下一次分配从此处开始。
end:内存池结束位置;
next:内存池里面有很多块内存,这些内存块就是通过该指针连成链表的,next指向下一块内存。
failed:内存池分配失败次数。
ngx_pool_s
d:内存池的数据块;
max:内存池数据块的最大值;
current:指向当前内存池;
chain:该指针挂接一个ngx_chain_t结构;
large:大块内存链表,即分配空间超过max的情况使用;
cleanup:释放内存池的callback
log:日志信息
在这里插入图片描述
二、内存池的创建
在这里插入图片描述
三、内存池中内存的分配申请
在内存池中分配内存有三种情况
(用户需要申请的空间size和池内的剩余空间相比较,如果大于剩余空间但是小于
max则用next指针在增加内存池;如果直接大于max则申请大块内存)
1.申请的是小块内存,内存池中的空间足够
直接移动起始指针
2.申请的是小块内存,内存池中空间不够
建立同等大小的内存池并分配size大小的空间
3.申请的是大块内存
在堆中申请大块内存,并用链表管理
注意:①开辟内存为什么要考虑内存对齐是因为内存取整可以降低CPU读取内存的次数,提高性能。主要为减少内存的I/O操作,由于此操作性能太低。
②nginx内存池的大块内存和小块内存的界是max即一页内容=4096字节=4k
③小块内存为什么不提供释放函数,只有一个重置函数ngx_reset_pool什么时候调用呢 ?
因为http协议本身就是一个短连接,无状态的协议。
处理完请求,服务器断开。在处理完http请求完成之后,就可以发起内存池的重置函数

在这里插入图片描述
四、内存池中的内重置
释放大块内存,重置小块内存
在这里插入图片描述
五、内存池清理
只释放大块内存
在这里插入图片描述
六、内存池摧毁
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值