最近一段时间,在面试时,听过别人说为啥不在空闲的时间看看开源代码呢?作为学生就应该多看看别人写的代码,然后在在别人的代码上面写出一些应用。听过这些话后,感觉确实比较有感触,所以就开始慢慢的接触nginx方面的源码。做完自己的锻炼吧!
今天刚开始接触nginx内存池结构。
Nginx可以开启多个进程,每个进程拥有最大上限128个子线程以及一定的可用连接数。如果你希望使用线程可以在配置文件中设置worker_threads这个参数,但这个参数在Nginx官方手册上没有。只有通过阅读源代码才看到。最大客户端连接数等于进程数与连接数的乘积,连接是在主进程中初始化的,一开始所有连接处于空闲状态。
nginx 由以下几个元素组成: 1. worker(进程)
2. thread(线程)
3. connection(连接)
4. event(事件)
5. module(模块)
6. pool(内存池)
7. cycle(全局设置)
8. log(日志)
内存池中有几个比较重要的结构体,如下:
内存池的管理节点:
typedef struct {
u_char *last; /* 指向所使用内存的最后的地址 */
u_char *end; /* 指向所申请到内存块的最后的地址 */
ngx_pool_t *next; /* 指向下一个ngx_pool_t */
ngx_uint_t failed; /* 这个 */
} ngx_pool_data_t;
内存池管理队列的头结点:
struct ngx_pool_s {
ngx_pool_data_t d;
size_t max; /* 内存池块中空闲空间的大小 */
ngx_pool_t *current; /* 指向当前块自身 */
ngx_chain_t *chain;
ngx_pool_large_t *large; /* 用来指向大块内存 */
ngx_pool_cleanup_t *cleanup; /* 释放内存时调用的清除函数队列 */
ngx_log_t *log; /* 指向log的指针 */
};
大块内存结点:
typedef struct ngx_pool_large_s ngx_pool_large_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next; /*指向下一块大内存
void *alloc;
};
清除函数的队列结构:
typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t;
struct ngx_pool_cleanup_s {
ngx_pool_cleanup_pt handler;
void *data;
ngx_pool_cleanup_t *next; /*指向下一个清除函数
};