1. 内存分配逻辑:
分配一块内存,如果分配的内存size小于内存池的pool->max的限制,则属于小内存块分配,走小内存块分配逻辑;否则走大内存分配逻辑。小内存分配逻辑:
循环读取pool->d上的内存块,是否有足够的空间容纳需要分配的size,如果可以容纳,则直接分配内存;否则内存池需要申请新的内存块,调用ngx_palloc_block。
大内存分配逻辑:当分配的内存size大于内存池的pool->max的限制,则会直接调用ngx_palloc_large方法申请一块独立的内存块,并且将内存块挂载到pool->large
的链表上进行统一管理。

2. cleanup机制 可以回调函数清理数据
Nginx的内存池cleanup机制,设计的非常巧妙。pool->cleanup本身是一个链表,每个ngx_pool_cleanup_t的数据结构上,保存着内存数据的本身cleanup->data和
回调清理函数cleanup->handler。通过cleanup的机制,我们就可以在内存池上保存例如文件句柄fd的资源。当我们调用ngx_destroy_pool方法销毁内存池的时候,
首先会来清理pool->cleanup,并且都会执行c->handler(c->data)回调函数,用于清理资源。Nginx的这个机制,最显著的就是让文件描述符和需要自定义清理的
数据的管理变得更加简单。
分配一个cleanup结构:
/*** 分配一个可以用于回调函数清理内存块的内存* 内存块仍旧在p->d或p->large上* ngx_pool_t中的cleanup字段管理着一个特殊的链表,该链表的每一项都记录着一个特殊的需要释放的资源。* 对于这个链表中每个节点所包含的资源如何去释放,是自说明的。这也就提供了非常大的灵活性。* 意味着,ngx_pool_t不仅仅可以管理内存,通过这个机制,也可以管理任何需要释放的资源,* 例如,关闭文件,或者删除文件等等的。下面我们看一下这个链表每个节点的类型* 一般分两种情况:* 1. 文件描述符* 2. 外部自定义回调函数可以来清理内存*/


举例:对资源进行释放,在调用内存池销毁函数时,将内存池中清理链表中的函数都执行一遍

参考资料:

1. https://blog.csdn.net/initphp/article/details/50588790#ngx_pool_cleanup_t%20%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B8%85%E7%90%86%E5%9B%9E%E8%B0%83%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84

Nginx 内存池源码阅读相关推荐

  1. 内存池组件以及根据nginx内存池源码设计实现简易内存池

    目录 造轮子内存池原因引入 大量的malloc/free小内存所带来的弊端 弊端 出现场景 大牛解决措施(nginx内存池) 内存池技术 啥叫作内存池技术 内存池技术为啥可以解决上文弊端 高并发内存池 ...

  2. 深度剖析SGI STL二级空间配置器内存池源码

    文章目录 一.SGI STL二级空间配置器重要成员解读 二. 二级空间配置器内存池的结构 三. 两个重要的函数 1. _S_round_up 2. _S_freelist_index 四. 内存池al ...

  3. bytebuf池_Netty篇:ByteBuf之内存池源码分析

    Netty的内存池的实现有些复杂,使用了大量的位运算,晦涩难懂,不过万能的博客上好多大神已经介绍的非常详细,推荐四篇很详细很棒的源码分析的文章链接,本文根据自己的理解顺一下思路,内容主要也是出自以下四 ...

  4. Nginx源码阅读:ngx_palloc 内存池

    Nginx源码阅读:ngx_palloc 内存池 一.内存池 二.大块 三.chunck(小块) 四.nginx内存池的结构图 五.源码阅读 1.`ngx_create_pool` 2.`ngx_de ...

  5. Nginx源码阅读:共享内存ngx_shm_t和它的组织方式ngx_shm_zone_t、ngx_list_t

    Nginx源码阅读:共享内存ngx_shm_t和它的组织方式ngx_shm_zone_t.ngx_list_t 一.Nginx中共享内存的结构图 二.Nginx中实现共享内存的部分 1.共享内存配置信 ...

  6. 【Nginx 源码学习】内存池 及 优秀案例赏析:Nginx内存池设计

    文章目录 关于设计内存池之我的想法 内存池案例 malloc 底层原理 jemalloc && tcmalloc Nginx内存池设计 基础数据结构 源码分析 ngx_create_p ...

  7. Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现

    Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现 一.Nignx中的模块是什么? 二.模块的基本结构 `ngx_module_s` `ngx_command_s` `ngx_ ...

  8. Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索

    Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索 简介 在上篇文章中,了解了连接池的应用场景和本地运行了示例,本篇文章中,我们尝试来探索下Alibaba Druid数据库连接池的整 ...

  9. Alibaba Druid 源码阅读(一) 数据库连接池初步

    Alibaba Druid 源码阅读(一) 数据库连接池初步 简介 本文将初步探索数据库连接池的应用场景,为后面的源码分析做些准备 数据库连接池的应用场景 在没有连接池之前,在使用中,需要访问数据库时 ...

  10. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

最新文章

  1. vue-devTools插件安装流程
  2. Lispbox的简单配置
  3. proe输入数字时成双出现_Proe/Creo步进电机正反转仿真详解
  4. layaAir引擎制作游戏的图集动画、时间轴动画、和骨骼动画总结二
  5. “脚踢各大Python Web框架”,Sanic真有这能耐么?
  6. c++读取文件–结束条件的判断
  7. 第三次实验及动手动脑
  8. shell export path_Shell的变量声明
  9. javaweb实训第一天上午——HTML和CSS
  10. 菜鸟的学习之路(10) — LinkedList类
  11. oracle视图建主键
  12. 游戏圈子--创业股份没拿到,你该怨谁?
  13. uni-app 使用蓝牙打印机ESC/POS指令基础方法
  14. ubuntu安装mysql失败了,为啥嘞
  15. 【06月24日】预分红股息率最高排名
  16. 聚焦网络攻击|知道创宇云安全2018年度网络安全态势报告
  17. C++一本通题库1013
  18. 职场饭桌:酒桌上的规矩,与领导吃饭如何谈话
  19. 【开发技能】研发线上事故总结!
  20. 选择DC-DC开关电源控制器的实战过程

热门文章

  1. L1-044 稳赢 (15 分)—团体程序设计天梯赛
  2. android studio 如何导入 RecyclerView
  3. Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Active Dataguard篇
  4. 编程一年来的疑惑和思考
  5. 平均分配,移动欠费催收款数据的分配应用实例
  6. 网络工程师Day7--本地AAA配置
  7. 计算机网络网络层之数据报网络
  8. unity脚本中print及Debug.Log
  9. MySQL主从同步(四)——M-M架构配置实战
  10. Linux SSHD服务安装与维护详解(二)——SSHD调优和fail2ban联动