nginx主要使用內存池進行內存管理,nginx中從內存池中分配內存的大小爲NGX_MAX_ALLOC_FROM_POOL,爲ngx_pagesize - 1,其中ngx_pagesize的大小在操作系統中爲4095.
nginx中主要的內存管理函數:
1.創建內存池(ngx_create_pool() )
調用ngx_memalign(NGX_POOL_ALIGNMENT, size, log)函數來分配內存,使用內存對齊的方式,以16字方式對齊;
初始化ngx_pool_data_t的一些數據,如last,end,next,和ngx_pool_t的current,large,chain,cleanup變量
2.銷燬內存池(ngx_destroy_pool)
首先銷燬內存池中的ngx_cleanup_t,遍歷pool的cleanup析構函數;
然後銷燬內存池中的大塊內存,使用ngx_free()函數進行打開內存銷燬;
然後依次銷燬內存池;調用pool->next指針進行遍歷銷燬;
- for (c = pool->cleanup; c; c = c->next) {
- if (c->handler) {
- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "run cleanup: %p", c);
- c->handler(c->data);
- }
- }
- //前面講到,cleanup指向析構函數,用於執行相關的內存池銷燬之前的清理工作,如文件的關閉等,
- //清理函數是一個handler的函數指針掛載。因此,在這部分,對內存池中的析構函數遍歷調用。
- for (l = pool->large; l; l = l->next) {
- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
- if (l->alloc) {
- ngx_free(l->alloc);
- }
- }
3.重置內存池(ngx_reset_pool)
對於初始分配的內存池,沒有大塊的內存池,而且last的大小增加sizeof(ngx_pool_t)的大小;
函數使用ngx_free函數釋放大塊內存,然後重新設置last值。