nginx源码那些事之内存管理模块一
来源:互联网 发布:c盘windows文件夹30g 编辑:程序博客网 时间:2024/06/18 16:59
nginx主要使用内存池进行内存管理,nginx中从内存池中分配内存的大小为NGX_MAX_ALLOC_FROM_POOL,为ngx_pagesize - 1,其中ngx_pagesize的大小在操作系统中为4095.
nginx中主要的内存管理函数:
1.创建内存池(ngx_create_pool() )
调用ngx_memalign(NGX_POOL_ALIGNMENT, size, log)函数来分配内存,使用内存对齐的方式,以16字方式对齐;
初始化ngx_pool_data_t的一些数据,如last,end,next,和ngx_pool_t的current,large,chain,cleanup变量
2.销毁内存池(ngx_destroy_pool)
首先销毁内存池中的ngx_cleanup_t,遍历pool的cleanup析构函数;
然后销毁内存池中的大块内存,使用ngx_free()函数进行打开内存销毁;
然后依次销毁内存池;调用pool->next指针进行遍历销毁;
- for (c = pool->cleanup; c; c = c->next) {
- if (c->handler) {
- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "run cleanup: %p", c);
- c->handler(c->data);
- }
- }
- //前面讲到,cleanup指向析构函数,用于执行相关的内存池销毁之前的清理工作,如文件的关闭等,
- //清理函数是一个handler的函数指针挂载。因此,在这部分,对内存池中的析构函数遍历调用。
- for (l = pool->large; l; l = l->next) {
- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
- if (l->alloc) {
- ngx_free(l->alloc);
- }
- }
3.重置内存池(ngx_reset_pool)
对于初始分配的内存池,没有大块的内存池,而且last的大小增加sizeof(ngx_pool_t)的大小;
函数使用ngx_free函数释放大块内存,然后重新设置last值。
- nginx源码那些事之内存管理模块一
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx(三)源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理 .
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理 .
- Nginx源码剖析之内存池,与内存管理
- 【转载】Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池和内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池和内存管理
- Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池、内存管理
- Android画图学习总结(三)——Drawable
- MFC学习之路(四)不够细心,一个小问题蛋疼了一天
- Oracle数据库 Left Join 使用之我见
- Android画图学习总结(四)——Animation(上)
- Http和Socket连接区别
- nginx源码那些事之内存管理模块一
- 外部排序
- oracle 时间差计算
- Android画图学习总结(四)——Animation(下)
- Oracle Sql语句长度限制问题及解决
- Android画图学习总结(四)——Animation(中)
- 淡淡苦涩,才是今天滋味。
- Oracle 导出数据到文本文件
- Android画图学习总结(五)——Paint