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教程有兴趣的朋友有所帮助。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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

linux printf digunakan dalam baris arahan Arahan ini digunakan untuk memformat data cetakan printf ialah "printf FORMAT [ARGUMENT]...printf OPTION", di mana pilihan "help" bermaksud memaparkan maklumat bantuan, dan Pilihan "versi" bermaksud Paparkan maklumat versi.

Perbezaan antara putchar dan printf: 1. Jenis parameter putchar ialah int, dan jenis parameter printf ialah rentetan 2. putchar hanya boleh mengeluarkan satu aksara, dan printf boleh mengeluarkan berbilang aksara 3. putchar tidak boleh memformat output, tetapi printf boleh memformat output;

Perbezaan antara fprintf dan printf ialah destinasi output berbeza dengan output printf kepada aliran output standard, manakala output fprintf kepada aliran fail yang ditentukan. Pilih fungsi yang sesuai untuk melaksanakan operasi output mengikut keperluan. Perlu diingatkan bahawa fungsi fprintf perlu membuka fail melalui fungsi fopen terlebih dahulu, dan menutup fail melalui fungsi fclose selepas digunakan. Di samping itu, jika pembukaan fail gagal atau ralat operasi berlaku, pengendalian ralat diperlukan.

图片消失如何解决先是图片文件上传$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'
