ホームページ バックエンド開発 PHPチュートリアル nginx ソースコードの初読 (5) - メインの ngx_array から問題を解決しましょう

nginx ソースコードの初読 (5) - メインの ngx_array から問題を解決しましょう

Jul 29, 2016 am 09:02 AM
array pool size

配列の構造定義:

<code><span>typedef</span><span>struct</span> ngx_array_s       ngx_array_t;
<span>struct</span> ngx_array_s {
    <span>void</span>        *elts;           <span>// 指向数组存储位置的首地址</span>
    ngx_uint_t   nelts;          <span>// 当前数组中已经存放的元素个数</span>
    size_t       size;           <span>// 数组中每个元素的大小</span>
    ngx_uint_t   nalloc;         <span>// 当前最多能容纳的元素个数,类似cpp中的Vector,当nelts大于nalloc时扩容</span>
    ngx_pool_t  *pool;           <span>// 该数组对应的内存池</span>
};</code>
ログイン後にコピー

配列操作関数を以下に紹介します:

<code>ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
<span>/* 从pool中申请array结构体内存,并调用init初始化(申请n*size内存,改变array内的属性),
 * 所以元素与结构体内存可能并不连续,但肯定在同一个pool里,失败返回NULL */</span><span>void</span> ngx_array_destroy(ngx_array_t *a);
<span>/* 依次销毁数组的数据区和结构体内存,将内存返还给pool(last-=)
 * if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
       p->d.last = (u_char *) a;
   }
 * 销毁结构体的代码如上,因为这代码看起来很奇怪,它怎么知道数组肯定再pool的最后,没加过其他东西了?
   看了源码数组也并不是通过单独的pool来管理的,也就是说pool中还可能有很多其他的数据。
   在nginx整个代码中没有找到对ngx_array_destroy的引用
 */</span><span>void</span> *ngx_array_push(ngx_array_t *a);
<span>void</span> *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); 
<span>/* 在数组a上新追加元素,并返回指向新元素的指针。需要把返回的指针转换为具体类型,
   然后再给新元素本身或者是各字段(如果数组的元素是复杂类型)赋值。*/</span><span>static</span> ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *<span>array</span>, ngx_pool_t *pool, ngx_uint_t n, size_t size)
<span>/* 如果一个数组对象是被分配在堆上的,那么当调用ngx_array_destroy销毁以后,如果想再次使用,就可以调用此函数。
   如果一个数组对象是被分配在栈上的,那么就需要调用此函数,进行初始化的工作以后,才可以使用。*/</span></code>
ログイン後にコピー

上記のコードから深刻な問題に気づきましたか?それが破棄であろうと拡張であろうと、ソースコード内の元のメモリの場所は解放されていません。はい、これは間違いなくメモリの浪費を引き起こします。なぜ nginx 作者はそんなにメモリを気にするのでしょうか? 私にはそれが簡単に解決できないと思います。ただし、これを使用する場合は、複数の拡張によって生じる無駄を避けるために、事前に配列のサイズを計画することが最善であることには確かな理由があります。

')​​.addClass('事前番号付け').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

上記は、nginx ソースコードの最初の読み込み (5) - メインの ngx_array から問題を開始する内容を紹介しました。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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JavaのFile.length()関数を使用してファイルのサイズを取得します。 JavaのFile.length()関数を使用してファイルのサイズを取得します。 Jul 24, 2023 am 08:36 AM

ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

C# の Array.Sort 関数を使用して配列を並べ替える C# の Array.Sort 関数を使用して配列を並べ替える Nov 18, 2023 am 10:37 AM

タイトル: Array.Sort 関数を使用して C# で配列を並べ替える例 本文: C# では、配列は一般的に使用されるデータ構造であり、多くの場合、配列を並べ替える必要があります。 C# には Array クラスが用意されており、このクラスには配列を簡単に並べ替えるための Sort メソッドがあります。この記事では、C# で Array.Sort 関数を使用して配列を並べ替える方法を示し、具体的なコード例を示します。まず、Array.Sort 関数の基本的な使用法を理解する必要があります。 Array.So

PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 Jun 27, 2023 pm 01:48 PM

PHP でプログラミングする場合、多くの場合、配列をマージする必要があります。 PHP には、配列のマージを完了するための array_merge() 関数が用意されていますが、配列内に同じキーが存在する場合、この関数は元の値を上書きします。この問題を解決するために、PHP は配列をマージして同じキーの値を保持できる array_merge_recursive() 関数を言語で提供し、プログラム設計をより柔軟にします。配列マージ

PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 Jun 26, 2023 pm 01:41 PM

PHP には、配列操作をより便利かつ高速にする強力な配列関数が多数あります。 2 つの配列を結合して連想配列にする必要がある場合、PHP の array_combine 関数を使用してこの操作を実行できます。この関数は、実際には、ある配列のキーを別の配列の値として新しい連想配列に結合するために使用されます。次に、PHP の array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法を説明します。 array_comb について学ぶ

PHPのarray_fill()関数の使い方の詳しい説明 PHPのarray_fill()関数の使い方の詳しい説明 Jun 27, 2023 am 08:42 AM

PHP プログラミングにおいて、配列は大量のデータを簡単に処理できる非常に重要なデータ構造です。 PHP は配列関連の関数を多数提供しており、array_fill() はその 1 つです。この記事では、array_fill() 関数の使い方と実際の応用におけるヒントを詳しく紹介します。 1. array_fill() 関数の概要 array_fill() 関数の機能は、同じ値で構成される指定された長さの配列を作成することです。具体的には、この関数の構文は次のとおりです。

Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Jun 24, 2023 pm 10:39 PM

Java は、さまざまな開発分野で広く使用されている非常に強力なプログラミング言語です。ただし、Java プログラミング中に、開発者は ArrayIndexOutOfBoundsException 例外に遭遇することがよくあります。では、この異常の一般的な原因は何でしょうか? ArrayIndexOutOfBoundsException は、Java の一般的なランタイム例外です。これは、データにアクセスするときに、配列の添字が配列の範囲を超えていることを意味します。一般的な理由には次のようなものがあります。

TreeSet クラスの size() メソッドを使用して、ツリー コレクション内の要素の数を取得します。 TreeSet クラスの size() メソッドを使用して、ツリー コレクション内の要素の数を取得します。 Jul 24, 2023 am 11:05 AM

タイトル: TreeSet クラスの size() メソッドを使用して、ツリー コレクション内の要素の数を取得します。はじめに TreeSet は、Java コレクション フレームワークの順序付きコレクションです。SortedSet インターフェイスを実装し、赤黒ツリー データ構造を使用して、それを実装します。 TreeSet は、要素の自然な順序に従って、または Comparator カスタム コンパレータを使用して並べ替えることができます。この記事では、TreeSet クラスの size() メソッドを使用して、ツリー コレクション内の要素の数を取得し、提供する方法を紹介します。

PHP の array_change_key_case() 関数の使用方法の概要 PHP の array_change_key_case() 関数の使用方法の概要 Jun 27, 2023 am 10:43 AM

PHP プログラミングでは、配列は頻繁に使用されるデータ型です。 array_change_key_case() 関数など、多数の配列操作関数もあります。この関数は、配列内のキー名の大文字と小文字を変換して、データ処理を容易にすることができます。この記事では、PHP での array_change_key_case() 関数の使用方法を紹介します。 1. 関数の構文とパラメータ array_change_ke

See all articles