nginx内存池

本文介绍了通过分而治之的策略,针对不同大小的内存块进行管理,创建高效的内存池。关键数据结构如ngx_pool_data_t和ngx_pool_t用于内存分配、释放和跟踪。提供了ngx_palloc、ngx_pnalloc、ngx_pcalloc和ngx_pfree等内存操作函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现思路(分而治之)

对于每个请求或者连接都会建立相应的内存池,建好后,我们可直接从内存池中申请所需的内存,当内存池使用完成后,一次性释放内存池

区分大小内存块的申请和释放,大于池尺寸的定义为大内存块,使用单独的大内存块链表保存,及时分配和释放;小于等于池尺寸的定义为小内存块,直接从预先分配的内存块中提取,不够就扩充内存池中的内存,在生命周期内不做释放,直到最后统一销毁

关键数据结构

typedef struct{
    u_char*    last;        //保存当前数据块中内存分配指针的当前位置
    u_char*    end;         //保存内存块的结束位置
    ngx_pool_t* next;       //内存池由多个内存块组成,指向下一个数据块的位置
    ngx_uint_t  falied;     //当前数据块内存不足引起分配失败的次数
}ngx_pool_data_t;

typedef ngx_pool_s{
    ngx_pool_t               d;//内存池当前数据指针的结构体
    size_t                 max;//当前数据块可最大可分配的内存大小
    ngx_pool_t*        current;//当前正在使用的数据块的指针
    ngx_pool_large_t*    large;//pool中指向大数据块的指针(size>max)

};

struct ngx_pool_large_s{
    ngx_pool_large_t  *next;      //指向下一块大内存
    void               *alloc;    //大内存起始地址
}

内存申请(对齐)                              void* ngx_palloc(ngx_pool_t* pool,size_t size);

申请内存(不对齐)                           void* ngx_pnalloc(ngx_pool_t* pool,size_t size);

内存申请(对齐并初始化)                void* ngx_pcalloc(ngx_pool_t* pool,size_t size);

内存清除                                        ngx_int_t ngx_pfree(ngx_pool_t,void* p);   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值