nginx的内存池设计的比较简单了,一个内存池中分为两个部分:nginx
nginx中全部请求都单独对应一个内存池,在这个请求的过程当中,全部涉及到内存分配的地方,都到该请求相关的内存池中处理,而中间不会去释放回收内存,内存池的生命周期与请求同样,请求完毕则直接回收内存。这样的好处在于:统一分配和统一释放,下降了内存泄露问题的出现。数据结构
先来看结构体ngx_pool_data_t,它存储每一个ngx_pool_t结构体的meta元数据:架构
failed成员的引入是为了不某个pool虽然还有可用的空间,可是因为空间很小了因此常常性的分配空间失败,当累计失败的次数达到某个阈值时,下一次再次查找内存就直接跳过这个pool,而去寻找内存池链表中的下一个pool。在此我向你们推荐一个架构学习交流裙。交流学习裙号:687810532,里面会分享一些资深架构师录制的视频录像学习
ngx_pool_large_t结构体用于保存大内存块,这一块就比较简单粗暴了,直接分配一块大内存来使用。另外,多个大内存块之间也是以链表形式来组织数据。ui
// 管理超大空间的结构体 struct ngx_pool_large_s { // 指向下一个指针 ngx_pool_large_t *next; // 直接指向内存区域的指针 void *alloc; };
再来看ngx_pool_t结构体,该数据结构用于表示一个内存池,内存池内部以链表形式来组织数据。以下图:spa
须要说明的是:设计
有了以上数据结构的了解,从内存池分配内存的流程就很简单了:指针