ngx_array_t是nginx中设计的动态数组,类似于stl中的vector。下面我们结合实例分析。
一、实例
#include #include ngx_config.h#include ngx_conf_file.h#include nginx.h#include ngx_core.h#include ngx_string.h#include ngx_palloc.h#include ngx_queue.h volatile ngx_cycle_t *ngx_cycle; void ngx_log_error_core(ngx_uint_t level,ngx_log_t *log, ngx_err_t err, const char *fmt, ...){} void dump_pool(ngx_pool_t* pool) { while (pool) { printf(pool = 0x%x\n, pool); printf( .d\n); printf( .last =0x%x\n, pool->d.last); printf( .end =0x%x\n, pool->d.end); printf( .next =0x%x\n, pool->d.next); printf( .failed =%d\n, pool->d.failed); printf( .max = %d\n,pool->max); printf( .current =0x%x\n, pool->current); printf( .chain =0x%x\n, pool->chain); printf( .large =0x%x\n, pool->large); printf( .cleanup =0x%x\n, pool->cleanup); printf( .log =0x%x\n, pool->log); printf(available pool memory = %d\n\n, pool->d.end -pool->d.last); ngx_pool_large_t*large = pool->large; printf(*****large_pool*******\n); while(large) { printf(%p->,large); large= large->next; } printf(\n\n); pool = pool->d.next; } } typedef struct { intarray[128]; // 128 * 4 = 512}testnode; int main() { ngx_pool_t *pool; printf(--------------------------------\n); printf(create a new pool:\n); printf(--------------------------------\n); pool = ngx_create_pool(1024, null); dump_pool(pool); ngx_array_t*myarray = ngx_array_create(pool, 1, sizeof(testnode)); printf(******ngx_array_create**********\n); dump_pool(pool); testnode*t1 = ngx_array_push(myarray); testnode*t2 = ngx_array_push(myarray); printf(******ngx_array_push**********\n); dump_pool(pool); ngx_array_destroy(myarray);// 这里什么也没做 dump_pool(pool); ngx_destroy_pool(pool); return 0; }
运行结果:
--------------------------------create a new pool:--------------------------------pool = 0x95ae020 .d .last = 0x95ae048 .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain= 0x0 .large = 0x0 .cleanup = 0x0 .log = 0x0available pool memory = 984 *****large_pool*******null******ngx_array_create**********pool = 0x95ae020 .d .last = 0x95ae25c .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain = 0x0 .large = 0x0 .cleanup = 0x0 .log = 0x0available pool memory = 452 *****large_pool*******null******ngx_array_push**********pool = 0x95ae020 .d .last = 0x95ae264 .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain = 0x0 .large = 0x95ae25c .cleanup = 0x0 .log = 0x0available pool memory = 444 *****large_pool*******0x95ae25c->null******ngx_array_destroy******pool = 0x95ae020 .d .last = 0x95ae264 .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain = 0x0 .large = 0x95ae25c .cleanup = 0x0 .log = 0x0available pool memory = 444 *****large_pool*******0x95ae25c->null
1、 从 available pool memory 的变化可以得知,ngx_array_t、ngx_pool_large_t结构体本身所占内存是在内存池上分配内存的。
从源码中可以得到证明:
ngx_array_t *
ngx_array_create(ngx_pool_t*p, ngx_uint_t n, size_t size)
{
a = ngx_palloc(p, sizeof(ngx_array_t));
}
static void *
ngx_palloc_large(ngx_pool_t*pool, size_t size)
{
// 在内存池上分配。
large = ngx_palloc(pool,sizeof(ngx_pool_large_t));
}
2、 ngx_array_push如果扩容,并不会释放原来占用的内存。可以参考ngx_array_push的源码,在此就不贴了。
3、 如果分配动态数组的大小超过一块内存池的容量(在本例中是1024),会调用ngx_palloc_large分配大块内存。
4、 如果动态数组所占内存是大块内存,ngx_array_destroy不会做任何事情,并且该api在nginx内核源码中没有被调用过。
编译可以参考上一遍分析ngx_queue_t结构体的文章。
二、参考资料:
《深入理解nginx》陶辉
http://blog.csdn.net/livelylittlefish/article/details/6586946
以上就介绍了nginx动态数组ngx_array_t,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。