Nginx源码阅读笔记-内存池的设计

栏目: 服务器 · Nginx · 发布时间: 6年前

内容简介:nginx的内存池设计的比较简单了,一个内存池中分为两个部分:nginx中所有请求都单独对应一个内存池,在这个请求的过程中,所有涉及到内存分配的地方,都到该请求相关的内存池中处理,而中间不会去释放回收内存,内存池的生命周期与请求一样,请求完毕则直接回收内存。这样的好处在于:统一分配和统一释放,降低了内存泄露问题的出现。先来看结构体ngx_pool_data_t,它存储每个ngx_pool_t结构体的meta元数据:

nginx的内存池设计的比较简单了,一个内存池中分为两个部分:

  • 超过max大小的内存分配,走大块内存分配,这部分内存管理由ngx_pool_large_t结构体负责。
  • 否则就是在ngx_pool_t遍历符合要求的ngx_pool_t结构体,找到符合要求大小的pool直接返回,否则就申请一块新的内存pool。

nginx中所有请求都单独对应一个内存池,在这个请求的过程中,所有涉及到内存分配的地方,都到该请求相关的内存池中处理,而中间不会去释放回收内存,内存池的生命周期与请求一样,请求完毕则直接回收内存。这样的好处在于:统一分配和统一释放,降低了内存泄露问题的出现。

ngx_pool_data_t

先来看结构体ngx_pool_data_t,它存储每个ngx_pool_t结构体的meta元数据:

  • u_char *last:指向分配空间的可用空间。
  • u_char *end:指向分配空间的最后位置。
  • ngx_pool_t *next:指向下一个ngx_pool_t指针。
  • ngx_uint_t failed:存储本ngx_pool_t结构体分配失败次数。

Nginx源码阅读笔记-内存池的设计

failed成员的引入是为了避免某个pool虽然还有可用的空间,但是由于空间很小了所以经常性的分配空间失败,当累计失败的次数达到某个阈值时,下一次再次查找内存就直接跳过这个pool,而去寻找内存池链表中的下一个pool。

ngx_pool_large_t

ngx_pool_large_t结构体用于保存大内存块,这一块就比较简单粗暴了,直接分配一块大内存来使用。另外,多个大内存块之间也是以链表形式来组织数据。

// 管理超大空间的结构体
struct ngx_pool_large_s {
  // 指向下一个指针
  ngx_pool_large_t     *next;
  // 直接指向内存区域的指针
  void                 *alloc;
};

ngx_pool_t

再来看ngx_pool_t结构体,该数据结构用于表示一个内存池,内存池内部以链表形式来组织数据。如下图:

Nginx源码阅读笔记-内存池的设计

需要说明的是:

  • 内存池内部以链表形式组织起来,完成这个工作的就是前面的ngx_pool_data_t的next成员。
  • current指针,用于表示当前该内存池在使用的pool指针。除了内存池链表的头结点之外,内存池链表其他节点的该指针无效。之所以需要这个指针,就是前面提到的,在某个内存池多次失效的情况下,下一次直接跳过该内存池查找空间,current指针保存当前在内存池链表的哪一个内存池上面查找空间。

有了以上数据结构的了解,从内存池分配内存的流程就很简单了:

Nginx源码阅读笔记-内存池的设计


以上所述就是小编给大家介绍的《Nginx源码阅读笔记-内存池的设计》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web标准和SEO应用实践

Web标准和SEO应用实践

Aarron Walter / 李清 / 机械工业出版社 / 2008 / 36.00元

本书是关于搜索引擎优化和易发现性的技术指南。. 本书介绍Web标准、可访问性以及Ajax、API、Flash和微格式等内容,包括标记策略、服务器端策略、内容策略、建构易发现的博客、在网站内添加搜索、防止易发现性障碍、用邮件列表挽回流量、将易发现性付诸实践。 本书适合网站开发者与SEO技术业余爱好者等参考。 这不是为营销专家写的一本SEO的书。 针对那些想要找到网站的目标用户......一起来看看 《Web标准和SEO应用实践》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具