Nginx内存管理
来源:互联网 发布:咏春拳可以自学吗 知乎 编辑:程序博客网 时间:2024/05/16 18:49
ngx_pool_t:typedef struct ngx_pool_s ngx_pool_t;struct ngx_pool_s { // 内存池的管理分配模块 ngx_pool_data_t d; // 内存池的数据块 size_t max; // 数据块大小,小块内存的最大值 ngx_pool_t *current; // 指向内存池可用数据块 ngx_chain_t *chain; // 该指针挂接一个ngx_chain_t结构 ngx_pool_large_t *large; // 指向大块内存分配,nginx中,大块内存分配直接采用标准系统接口malloc ngx_pool_cleanup_t *cleanup; // 析构函数,挂载内存释放时需要清理资源的一些必要操作 ngx_log_t *log; // 内存分配相关的日志记录 };
ngx_pool_data_t:typedef struct { // 内存池的数据结构模块 u_char *last; // 当前内存分配结束位置,即下一段可分配内存的起始位置 u_char *end; // 内存池的结束位置 ngx_pool_t *next; // 链接到下一个内存池,内存池的很多块内存就是通过该指针连成链表的 ngx_uint_t failed; // 记录内存分配不能满足需求的失败次数,当失败次数大于指定值时 current 指向下一内存池单元 } ngx_pool_data_t; // 结构用来维护内存池的数据块,供用户分配小块内存使用。
Nginx的内存池分为两个部分,一种是小块内存,一种是大块内存。小块内存指的是last所指向的位置,大块内存则需要重新开辟,由large指向。在需要开辟新的内存时,当传入内存大小大于max值时,在large中查找(如果向后查三个都没有找到合适的内存块,则开辟新的内存块并加入链表),反之,在last所指内存中查找。当小块内存不够时,会开辟新的内存块,由next指针指向。
当需要销毁内存时,大块内存直接用ngx_free释放,小块则不做处理,只有在销毁整个内存池时才会处理。
内存池的销毁步骤:
调用所有cleanup函数,清理数据
释放所有大块内存
释放所有内存池中的内存块
0 0
- nginx内存池管理
- nginx -- datastruct:内存管理
- nginx内存池管理
- nginx内存池管理
- nginx共享内存管理
- Nginx内存管理
- Nginx 内存池管理
- Nginx内存管理
- Nginx slab内存管理
- Nginx 内存池管理
- Nginx内存管理
- Nginx内存管理
- nginx内存管理
- Nginx内存管理详解
- nginx-内存管理源码注释
- nginx内存池ngx_pool_t 及内存管理
- nginx的内存池及内存管理
- 看nginx内存管理的一些感想
- 创建虚拟机
- Android 无法生成R文件及aapt.exe不断停止工作如何解决
- 点云双窗口显示
- POJ 3767 I Wanna Go Home 笔记 最短路径
- 用 Lua 实现一个微型虚拟机-基本篇
- Nginx内存管理
- 数据库(第一范式,第二范式,第三范式)
- org.gjt.mm.mysql.Driver和com.mysql.jdbc.Driver的区别
- MySQL (四) DCL 用户 权限 增删改查
- SML-Dplab
- 信号注册函数sigaction
- FusionCharts绘图插件(二)——绑定数据源
- 2017.2.14-15自测(那些普及神题)
- hdu 5446 Unknown Treasure (Lucas定理+中国剩余定理)