nginx_pool提供了一種資源管理機制(如記憶體,檔案等),使得對資源的使用和釋放統一進行,免除了資源釋放的很多問題,開發人員只需在需要記憶體時進行申請即可,不用過多考慮記憶體的釋放等問題,大大提高了開發的效率。
例如,在特定的生命週期統一建立記憶體池(如main函數系統啟動初期即分配1024B大小的記憶體池),需要記憶體時統一分配記憶體池中的記憶體,在適當的時候釋放記憶體池的記憶體(如關閉http連結時調用ngx_destroy_pool進行銷毀)。
typedefstruct ngx_pool_s ngx_pool_t;typedefstruct ngx_pool_cleanup_s ngx_pool_cleanup_t;typedefvoid (*ngx_pool_cleanup_pt)(void *data);struct ngx_pool_cleanup_s { ngx_pool_cleanup_pt handler; void *data; ngx_pool_cleanup_t *next;};typedefstruct ngx_pool_large_s ngx_pool_large_t;struct ngx_pool_large_s { ngx_pool_large_t *next; void *alloc;};typedefstruct { u_char *last; u_char *end; /* 分別指當前記憶體池的分配位置(下次從last分配記憶體)和結束位置(記憶體用光啦) * if ((size_t) (p->d.end - m) >= size) { p->d.last = m + size; return m; } */ ngx_pool_t *next; /* 指向下一個pool記憶體塊(當pool記憶體不足的時候會調用palloc_block來建立一塊新的pool並分配記憶體) * psize = (size_t) (pool->d.end - (u_char *) pool); m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log); new = (ngx_pool_t *) m; p->d.next = new; */ ngx_uint_t failed; /* 當前block記憶體配置失敗次數,從這段代碼看應該current是用來記錄要建立記憶體塊的搜尋位置? 因為它記錄了從這一塊開始記憶體不夠用,而failed是為了重新導向current而存在的,減少遍曆數量(在4以內) * for (p = pool->current; p->d.next; p = p->d.next) { if (p->d.failed++ > 4) { pool->current = p->d.next; } } */} ngx_pool_data_t;struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain_t *chain; ngx_pool_large_t *large; ngx_pool_cleanup_t *cleanup; ngx_log_t *log;};
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
').text(i)); }; $numbering.fadeIn(1700); }); });
以上就介紹了nginx源碼初讀(3)--讓煩惱從main開始ngx_pool,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。