nginx动态数组ngx_array_t
ngx_array_t是nginx中设计的动态数组,类似于STL中的vector
一、实例
<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; }</stdio.h></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、 从 available pool memory 的变化可以得知,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));
}
static void *
ngx_palloc_large(ngx_pool_t*pool, size_t size)
{
// 在内存池上分配。
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结构体的文章。
二、参考资料:
《深入理解nginx》陶辉
http://blog.csdn.net/livelylittlefish/article/details/6586946
以上就介绍了nginx动态数组ngx_array_t,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



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

Linux printf est utilisé dans la ligne de commande. Cette commande est utilisée pour formater les données d'impression ; le format de commande de printf est "printf FORMAT [ARGUMENT]...printf OPTION", où l'option "help" signifie afficher les informations d'aide, et le L'option "version" signifie Afficher les informations de version.

La différence entre putchar et printf : 1. Le type de paramètre de putchar est int et le type de paramètre de printf est une chaîne ; 2. putchar ne peut générer qu'un seul caractère et printf peut générer plusieurs caractères 3. putchar ne peut pas formater la sortie, mais ; printf peut le formater en sortie ; 4. putchar n'a pas de valeur de retour, printf renvoie le nombre de caractères générés avec succès ; 5. putchar sort sur la console, printf n'est pas limité à la sortie sur la console ;

La différence entre fprintf et printf est que la destination de sortie est différente. printf génère le flux de sortie standard, tandis que fprintf génère le flux de fichiers spécifié. Sélectionnez la fonction appropriée pour effectuer les opérations de sortie selon vos besoins. Il convient de noter que la fonction fprintf doit d'abord ouvrir le fichier via la fonction fopen, et fermer le fichier via la fonction fclose après utilisation. De plus, si l'ouverture du fichier échoue ou si une erreur d'opération se produit, une gestion des erreurs est requise.

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

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

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