Home >Backend Development >PHP Tutorial >Nginx memory management
1. Source code location
Header file: http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_palloc.h
Source file: http://trac.nginx.org/ nginx/browser/nginx/src/core/ngx_palloc.c
2. Data structure definition
Let’s first learn about several main data structures of nginx memory pool:
ngx_pool_data_t (memory pool data block structure)
ngx_pool_s (memory pool header structure)
is composed of ngx_pool_data_t and ngx_pool_t The composed nginx memory pool structure is shown in the figure below:
3. Introduction to related functions
Before analyzing the memory pool method, we need to introduce several main memory-related functions:
ngx_alloc: (just对malloc进行了简单的封装)
1:void * 2: ngx_alloc(size_t size, ngx_log_t *log) 3: { 4: void *p; 5: 6: p = malloc(size); 7: if (p == NULL) { 8: ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, 9: "malloc(%uz) failed", size); 10: } 11: 12: ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); 13: 14: return p; 15: }
ngx_calloc:(调用malloc并初始化为0)
1:void * 2: ngx_calloc(size_t size, ngx_log_t *log) 3: { 4: void *p; 5: 6: p = ngx_alloc(size, log); 7: 8: if (p) { 9: ngx_memzero(p, size); 10: } 11: 12: return p; 13: }
ngx_memzero:
1: #define ngx_memzero(buf, n) (void) memset(buf, 0, n)
ngx_free :
1: #define ngx_free free
ngx_memalign:
1:void * 2: ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) 3: { 4: void *p; 5: int err; 6: 7: err = posix_memalign(&p, alignment, size); 8: 9: if (err) { 10: ngx_log_error(NGX_LOG_EMERG, log, err, 11: "posix_memalign(%uz, %uz) failed", alignment, size); 12: p = NULL; 13: } 14: 15: ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, 16: "posix_memalign: %p:%uz @%uz", p, size, alignment);rrree
The alignment here is mainly for some unix platforms that require dynamic alignment. It encapsulates posix_memalign() provided by POSIX 1003.1d. In most cases, In this case, the compiler and C library transparently handle the alignment problem for you. nginx is controlled through the macro NGX_HAVE_POSIX_MEMALIGN; calling posix_memalign( ) successfully will return sizebytes of dynamic memory, and the address of this memory is a multiple of alignment. The parameter alignment must be a power of 2, or a multiple of the size of the void pointer. The address of the returned memory block is placed in memptr, and the function return value is 0.
Create a memory pool | ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log); |
Destroy the memory pool | vo id ngx_destroy_pool(ngx_pool_t *pool ; ( Not aligned) |
Memory clearing | |
4.1 创建内存池ngx_create_pool
4.2 内存申请 ngx_palloc
3、分配大块内存 ngx_palloc_large(ngx_pool_t *pool, size_t size)
4.4 内存池释放 ngx_pfree |