nginx動的配列ngx_array_t

Aug 08, 2016 am 09:23 AM
pool printf quot

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Linuxのprintfはどこにありますか Linuxのprintfはどこにありますか Mar 10, 2023 am 09:05 AM

linux printf はコマンド ラインで使用されます。このコマンドは印刷データのフォーマットに使用されます。printf のコマンド形式は「printf FORMAT [ARGUMENT]...printf OPTION」です。「help」オプションはヘルプ情報の表示を意味し、 「version」オプションはバージョン情報を表示することを意味します。

putchar と printf の違いは何ですか putchar と printf の違いは何ですか Aug 22, 2023 pm 01:55 PM

putchar と printf の違い: 1. putchar のパラメータの型は int で、printf のパラメータの型は string; 2. putchar は 1 文字のみ出力でき、printf は複数の文字を出力できます; 3. putchar は出力をフォーマットできませんが、 printf はフォーマットできます。出力; 4. putchar には戻り値がありません。printf は正常に出力された文字数を返します。5. putchar はコンソールに出力します。printf はコンソールへの出力に限定されません。6. パフォーマンスなど。

fprintfとprintfの違い fprintfとprintfの違い Nov 28, 2023 am 10:48 AM

fprintf と printf の違いは出力先が異なり、printf は標準出力ストリームに出力するのに対し、fprintf は指定されたファイル ストリームに出力します。必要に応じて、適切な機能を選択して出力操作を実行します。 fprintf 関数は、まず fopen 関数でファイルを開き、使用後は fclose 関数でファイルを閉じる必要があることに注意してください。また、ファイルのオープンに失敗したり、操作エラーが発生した場合にはエラー処理が必要です。

写真が消える問題を解決する方法 写真が消える問題を解決する方法 Apr 07, 2024 pm 03:02 PM

写真が消える問題を解決する方法 まず、写真ファイル $file=$_FILES['userfile']; if(is_uploaded_file($file['tmp_name'])){$query=mysql_query("INSERT INTO gdb_banner() image_src) VALUES ('images/ {$file['name'

不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没有关问题 不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没有关问题 Jun 13, 2016 am 10:15 AM

不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没问题。

为什么小弟我在php上写的这个代码,在浏览器上什么都不显示 为什么小弟我在php上写的这个代码,在浏览器上什么都不显示 Jun 13, 2016 am 10:24 AM

为什么我在php上写的这个代码,在浏览器上什么都不显示啊

图片消失怎么解决 图片消失怎么解决 Jun 13, 2016 am 10:09 AM

图片消失如何解决先是图片文件上传$file=$_FILES['userfile'];  if(is_uploaded_file($file['tmp_name'])){$query=mysql_query("INSERT INTO gdb_banner(image_src ) VALUES ('images/{$file['name'

See all articles