Nginx 内存池源码阅读
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 内存池源码阅读相关推荐
- 内存池组件以及根据nginx内存池源码设计实现简易内存池
目录 造轮子内存池原因引入 大量的malloc/free小内存所带来的弊端 弊端 出现场景 大牛解决措施(nginx内存池) 内存池技术 啥叫作内存池技术 内存池技术为啥可以解决上文弊端 高并发内存池 ...
- 深度剖析SGI STL二级空间配置器内存池源码
文章目录 一.SGI STL二级空间配置器重要成员解读 二. 二级空间配置器内存池的结构 三. 两个重要的函数 1. _S_round_up 2. _S_freelist_index 四. 内存池al ...
- bytebuf池_Netty篇:ByteBuf之内存池源码分析
Netty的内存池的实现有些复杂,使用了大量的位运算,晦涩难懂,不过万能的博客上好多大神已经介绍的非常详细,推荐四篇很详细很棒的源码分析的文章链接,本文根据自己的理解顺一下思路,内容主要也是出自以下四 ...
- Nginx源码阅读:ngx_palloc 内存池
Nginx源码阅读:ngx_palloc 内存池 一.内存池 二.大块 三.chunck(小块) 四.nginx内存池的结构图 五.源码阅读 1.`ngx_create_pool` 2.`ngx_de ...
- 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.共享内存配置信 ...
- 【Nginx 源码学习】内存池 及 优秀案例赏析:Nginx内存池设计
文章目录 关于设计内存池之我的想法 内存池案例 malloc 底层原理 jemalloc && tcmalloc Nginx内存池设计 基础数据结构 源码分析 ngx_create_p ...
- Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现
Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现 一.Nignx中的模块是什么? 二.模块的基本结构 `ngx_module_s` `ngx_command_s` `ngx_ ...
- Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索
Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索 简介 在上篇文章中,了解了连接池的应用场景和本地运行了示例,本篇文章中,我们尝试来探索下Alibaba Druid数据库连接池的整 ...
- Alibaba Druid 源码阅读(一) 数据库连接池初步
Alibaba Druid 源码阅读(一) 数据库连接池初步 简介 本文将初步探索数据库连接池的应用场景,为后面的源码分析做些准备 数据库连接池的应用场景 在没有连接池之前,在使用中,需要访问数据库时 ...
- Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索
Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...
最新文章
- vue-devTools插件安装流程
- Lispbox的简单配置
- proe输入数字时成双出现_Proe/Creo步进电机正反转仿真详解
- layaAir引擎制作游戏的图集动画、时间轴动画、和骨骼动画总结二
- “脚踢各大Python Web框架”,Sanic真有这能耐么?
- c++读取文件–结束条件的判断
- 第三次实验及动手动脑
- shell export path_Shell的变量声明
- javaweb实训第一天上午——HTML和CSS
- 菜鸟的学习之路(10) — LinkedList类
- oracle视图建主键
- 游戏圈子--创业股份没拿到,你该怨谁?
- uni-app 使用蓝牙打印机ESC/POS指令基础方法
- ubuntu安装mysql失败了,为啥嘞
- 【06月24日】预分红股息率最高排名
- 聚焦网络攻击|知道创宇云安全2018年度网络安全态势报告
- C++一本通题库1013
- 职场饭桌:酒桌上的规矩,与领导吃饭如何谈话
- 【开发技能】研发线上事故总结!
- 选择DC-DC开关电源控制器的实战过程
热门文章
- L1-044 稳赢 (15 分)—团体程序设计天梯赛
- android studio 如何导入 RecyclerView
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Active Dataguard篇
- 编程一年来的疑惑和思考
- 平均分配,移动欠费催收款数据的分配应用实例
- 网络工程师Day7--本地AAA配置
- 计算机网络网络层之数据报网络
- unity脚本中print及Debug.Log
- MySQL主从同步(四)——M-M架构配置实战
- Linux SSHD服务安装与维护详解(二)——SSHD调优和fail2ban联动