转:Nginx源码剖析之内存池,与内存管理(1)
作者:July、dreamice、阿波、yixiao。
出处:http://blog.csdn.net/v_JULY_v/。
引言
Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx,以及诸多暂不曾得知的玩意儿。
读者可以到此处下载Nginx最新版本的源码:http://nginx.org/en/download.html。同时,本文本不想给源码太多注释,因为这不像讲解算法,算法讲解的越通俗易懂越好,而源码剖析则不同,缘由在于不同的读者对同一份源码有着不同的理解,或深或浅,所以,更多的是靠读者自己去思考与领悟。
ok,本文之中有任何疏漏或不正之处,恳请批评指正。谢谢。
Nginx源码剖析之内存池
1、内存池结构
内存相关的操作主要在文件 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 中实现,ok,咱们先来看内存管理中几个主要的数据结构:
typedef struct { //内存池的数据结构模块
u_char *last; //当前内存分配结束位置,即下一段可分配内存的起始位置
u_char *end; //内存池的结束位置
ngx_pool_t *next; //链接到下一个内存池,内存池的很多块内存就是通过该指针连成链表的
ngx_uint_t failed; //记录内存分配不能满足需求的失败次数
} ngx_pool_data_t; //结构用来维护内存池的数据块,供用户分配之用。
struct ngx_pool_s { //内存池的管理分配模块
ngx_pool_data_t d; //内存池的数据块(上面已有描述),设为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; //内存分配相关的日志记录
};
再来看看大块数据分配的结构体:
struct ngx_pool_large_s {
ngx_pool_large_t *next;
void *alloc;
};
#define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1) //在x86体系结构下,该值一般为4096B,即4K
上述这些数据结构的逻辑结构图如下:











