ngx_array_t는 STL의 벡터
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>
실행 결과:
-------------------------------- 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 = 0x0 available 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 = 0x0 available 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 = 0x0 available 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 = 0x0 available pool memory = 444 *****large_pool******* 0x95ae25c->NULL
1. 사용 가능한 풀 메모리의 변화를 보면 ngx_array_t 및 ngx_pool_large_t 구조체 자체가 차지하는 메모리가 메모리 풀에 할당되어 있음을 알 수 있습니다.
소스 코드에서 증거를 얻을 수 있습니다:
ngx_array_t *
ngx_array_create(ngx_pool_t *p , ngx_uint_t n, size_t 크기)
{
a = ngx_palloc(p, sizeof(ngx_array_t));
}
정적 무효 *
ngx_palloc_large( ngx_pool_t* 풀, size_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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.