nginx之ngx_palloc

nginx通过内存池来管理所申请的内存,通过维护内存池,保证程序执行的效率以及避免造成内存泄漏。

ngx_palloc.h:

#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)

#define NGX_DEFAULT_POOL_SIZE    (16 * 1024)

#define NGX_POOL_ALIGNMENT       16
#define NGX_MIN_POOL_SIZE                                                     \
    ngx_align((sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t)),            \
              NGX_POOL_ALIGNMENT)
#define ngx_align(d,a) (((d) + (a - 1)) & ~(a - 1))
typedef void (*ngx_pool_cleanup_pt)(void *data);

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;
};
typedef struct ngx_pool_large_s  ngx_pool_large_t;

struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};
typedef struct {
    u_char               *last;
    u_char               *end;
    ngx_pool_t           *next;
    ngx_uint_t            failed;
} ngx_pool_data_t;
typedef struct {
    ngx_fd_t              fd;
    u_char               *name;
    ngx_log_t            *log;
} ngx_pool_cleanup_file_t;

内存池创建和销毁较为简单,主要在申请超过一页内存时,nginx是直接向操作系统申请,而不是从pool里申请;而ngx_palloc与ngx_pnalloc的区别在于申请之后是否进行了内存对齐

m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);

即ngx_pnalloc是直接从p->d.last开始。

这是从linux公社摘取的图片
上图是从Linux公社摘取的图片
linux公社的这篇文章写的很清晰,就不再做详细介绍了

销毁内存池的时候,由于cleanup的内存块是从pool里面分配的,因此不需要去free其中的内存了,直接销毁整个内存池即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值