内存池
nginx中的内存池是由N个内存池链表组成的,当一个内存池满了以后,就会从下一个内存池中提取空间来使用。
struct ngx_pool_s {
ngx_pool_data_t d; //表示数据区域
size_t max; //内存池能容纳数据的大小
ngx_pool_t * current; //当前内存池块(nginx中的内存池是又一连串的内存池链表组成的)
ngx_chain_t* chain; //主要为了将内存池连接起来
ngx_pool_large_t* large; //大块的数据
ngx_pool_cleanup_t* cleanup; //清理函数
ngx_log_t* log; //写log
};
其中结构体
数据区;
typedef struct {
u_char *last;
u_char *end;
ngx_pool_t *next;
ngx_uint_t failed; //failed标志申请内存的时候失败的次数。
} ngx_pool_data_t;
大块数据;
当一个申请的内存空间大小比内存池的大小还要大的时候,malloc一块大的空间,再内存池用保留这个地址的指针
struct ngx_pool_large_s {
ngx_pool_large_t* next;
void* alloc;
};
ngx_pool_cleanup_t保存内存池被销毁时用的清理函数
typedef void (*ngx_pool_cleanup_pt)(void *data);
struct ngx_pool_cleanup_s {
ngx_pool_cleanup_pt handler;
void* data;
ngx_pool_cleanup_t* next;
};
ngx_pool_t* ngx_create_poo(size_t size)
创建内存池
void* ngx_palloc(ngx_pool_t* pool, size_t size)
从内存池中分配内存
void ngx_destroy_pool(ngx_pool_t* pool)
内存池的销毁
static void* ngx_palloc_block(ngx_pool_t* pool, size_t size)
在nginx中,当内存池满了以后,会增加一个新的内存池。这个动作就是靠ngx_palloc_block函数实现的。
ngx_palloc_large 和 ngx_pfree
在nginx中,小块内存除了在内存池销毁之外是不能释放的,但是大块内存却可以,
-- 这两个函数就是用来控制大块内存的申请和释放
阅读(1241) | 评论(0) | 转发(0) |