Heim Backend-Entwicklung PHP-Tutorial Dynamisches Nginx-Array ngx_array_t

Dynamisches Nginx-Array ngx_array_t

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

ngx_array_t ist ein dynamisches Array, das in Nginx entworfen wurde, ähnlich wie vector Nachfolgend analysieren wir anhand von Beispielen.

1. Beispiel

<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>
Nach dem Login kopieren

Laufergebnis:

--------------------------------
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
Nach dem Login kopieren

1. Anhand der Änderungen im verfügbaren Poolspeicher können wir erkennen, dass der von den Strukturen ngx_array_t und ngx_pool_large_t selbst belegte Speicher im Speicherpool zugewiesen ist.

Der Beweis kann aus dem Quellcode erhalten werden:

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));

}

statische Leere *

ngx_palloc_large( ngx_pool_t* pool, size_t size)

{

large = ngx_palloc(pool,sizeof(ngx_pool_large_t));

}

2 Wenn ngx_array_push erweitert wird, wird der ursprünglich belegte Speicher nicht freigegeben. Sie können auf den Quellcode von ngx_array_push verweisen, der hier nicht veröffentlicht wird.

3. Wenn die Größe des zugewiesenen dynamischen Arrays die Kapazität eines Speicherpools (in diesem Fall 1024) überschreitet, wird ngx_palloc_large aufgerufen, um einen großen Speicherblock zuzuweisen.

4. Wenn der vom dynamischen Array belegte Speicher ein großer Speicherblock ist, führt ngx_array_destroy nichts aus und diese API wurde im Nginx-Kernel-Quellcode nicht aufgerufen.

Informationen zur Kompilierung finden Sie im vorherigen Artikel zur Analyse der ngx_queue_t-Struktur.

2. Referenzen:

"Vertiefendes Verständnis von Nginx" Tao Hui

http://blog.csdn.net/livelylittlefish/article/details/6586946

Das Obige stellt das dynamische Nginx-Array ngx_array_t vor, einschließlich des relevanten Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

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

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

Wo ist Linux printf? Wo ist Linux printf? Mar 10, 2023 am 09:05 AM

Linux printf wird in der Befehlszeile verwendet. Dieser Befehl wird zum Formatieren von Druckdaten verwendet. Das Befehlsformat von printf ist „printf FORMAT [ARGUMENT]...printf OPTION“, wobei die Option „help“ die Anzeige von Hilfeinformationen bedeutet Die Option „Version“ bedeutet Versionsinformationen anzeigen.

Was ist der Unterschied zwischen putchar und printf? Was ist der Unterschied zwischen putchar und printf? Aug 22, 2023 pm 01:55 PM

Der Unterschied zwischen putchar und printf: 1. Der Parametertyp von putchar ist int und der Parametertyp von printf ist string; 2. putchar kann nur ein Zeichen ausgeben, und printf kann mehrere Zeichen ausgeben. 3. putchar kann die Ausgabe nicht formatieren printf kann es formatieren. 4. putchar hat keinen Rückgabewert, printf gibt die Anzahl der erfolgreich ausgegebenen Zeichen zurück, printf ist nicht auf die Ausgabe auf die Konsole beschränkt.

Der Unterschied zwischen fprintf und printf Der Unterschied zwischen fprintf und printf Nov 28, 2023 am 10:48 AM

Der Unterschied zwischen fprintf und printf besteht darin, dass das Ausgabeziel unterschiedlich ist. printf gibt die Ausgabe an den Standardausgabestream aus, während fprintf an den angegebenen Dateistream ausgibt. Wählen Sie die entsprechende Funktion aus, um bei Bedarf Ausgabevorgänge durchzuführen. Es ist zu beachten, dass die Funktion fprintf die Datei zuerst über die Funktion fopen öffnen und die Datei nach der Verwendung über die Funktion fclose schließen muss. Darüber hinaus ist eine Fehlerbehandlung erforderlich, wenn das Öffnen der Datei fehlschlägt oder ein Betriebsfehler auftritt.

图片消失怎么解决 图片消失怎么解决 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