ngx_array_t は、STL の Vector
1. 例
<span style="font-size:18px;">#include <stdio.h> #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; }</span>
実行結果: 利用可能なプールメモリの変化から、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);
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構造を分析した以前の記事を参照してください。
2. 参考文献:
「nginx の徹底理解」Tao Hui
http://blog.csdn.net/livelylittlefish/article/details/6586946
上記は nginx 動的配列 ngx_array_t を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。