nginx源代码学习系列之 [内存池]

本文详细介绍了内存池的概念及设计方法,包括如何通过预分配内存和链表管理实现高效内存复用,并以Nginx内存池实现为例进行解析。

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

最近在学习nginx,刚学习完内存池,数组。写个笔记保存下。


一 内存池是啥回事?

内存池就是那么回事,名字叫得好高深。就是怕在程序运行过程中频繁去申请内存浪费时间增加系统开销。故而增加一个机制,使内存申请一次多次利用。

说白了,就是申请后我不释放给系统,只是程序内部虚拟释放(就是我们自己知道这段内存没用把数据清零处理)。这样就不用频繁去系统堆栈申请内存。

线程池也大概是同样的道理。类推。

就这么回事,别看面试官喜欢问乱七八糟的问题,也老喜欢整些专有名词以显摆自己多厉害,其实工作时候都用到了,只是没跟他们那样去个名字显摆罢了,鄙视下。


二 具体怎么设计内存池呢?

看个人洗好,我只想到2种办法:

 1, 预先申请一定数量的内存,比如定义一个大的数组char g_mem_pool[4m], 或 char* p = malloc(4M),然后给一个pos定位当前分配位置。需要分配多少就把pos后移多少,释放了就把pos前移多少,可以自己写个申请和释放的接口。很简单吧,就这么回事。使用的时候记得清除以前数据,免得垃圾数据干扰。

 2, 需要多少就申请多少,这个比较复杂,需要用到链表管理,这个典型的例子就是nginx。我就说下nginx怎么实现的,其他的我们可以举一反三。

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;
    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;
};

nginx是这样的,一开始申请一个1024B的内存,如果需要的内存大于max(max=1024-ngx_pool_s 结构大小)那么就申请一个实际需要的大块内存并且用大块链表管理起来,如果是小于max但是内存池不够呢就重新申请max大小的内存。具体还有一些细节,大家可以去看nginx源码或者跟我讨论,有需要的话,下次补上。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值