nginx動的配列ngx_array_t

WBOY
WBOYオリジナル
2016-08-08 09:23:171053ブラウズ

ngx_array_t は、STL の Vector に似た、nginx で設計された動的配列です。以下に例を挙げて分析します。

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 チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。