最近在学习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源码或者跟我讨论,有需要的话,下次补上。