nginx 메모리 풀 및 메모리 관리

4241 단어 nginx
nginx 메모리 관 리 는 자신 이 실현 하 는 메모리 탱크 구조 ngxpool_t. 완성, 본 고 는 주로 nginx 의 메모리 관 리 를 말한다.
nginx 메모리 관리 와 관련 된 네 가지 파일: src / core / ngxpalloc.h、src/core/ngx_palloc.c、src/os/unix/ngx_alloc.c、src/os/unix/ngx_alloc.h
ngx_alloc. h 와 ngxalloc. c 파일 은 주로 malloc, calloc, free, posixmemalign 과 memalign 의 포장 은 각각 ngx 로 봉 인 됩 니 다.alloc、ngx_calloc、ngx_free 와 ngxmemalign
ngx_alloc: 패 키 징 malloc 할당 메모리
ngx_calloc: malloc 할당 메모리 패키지 및 0 으로 초기 화
ngx_memalign: alignment 기반 정렬 크기 가 size 인 메모리 공간 을 되 돌려 줍 니 다. 즉, 주 소 는 alignment 의 정수 배 이자 2 의 멱 입 니 다.
ngx_palloc. c 파일 에 서 는 주로 메모리 풀 을 만 들 고 소각 하 며 메모리 풀 에서 메모 리 를 분배 합 니 다.
메모리 풀 구조
nginx 는 메모리 관 리 를 통일 적 으로 마 쳤 습 니 다. nginx 가 시 작 될 때 1024 B 크기 의 메모리 풀 을 분 배 했 습 니 다. 메모리 가 필요 할 때 메모리 풀 에서 메모 리 를 분배 하고 적당 한 시기 에 메모리 풀 의 메모 리 를 방출 합 니 다 (예 를 들 어 http 연결 을 닫 을 때 ngx destroy pool 을 호출 합 니 다).nginx 에서 메모리 탱크 구 조 는 ngx 로 정의 합 니 다.pool_t, 그 메모리 탱크 구 조 는 다음 과 같다.
4. 567913. 예 를 들 어 제거 작업, 큰 데이터 링크 등 다른 구조 도 있 는데 다음 과 같다.
typedef struct {
    u_char               *last;		//            ,          
    u_char               *end;	 	//        
    ngx_pool_t           *next;		//       ,        
    ngx_uint_t            failed;	//       
} 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_chain_t  
    ngx_pool_large_t     *large;   //      ,       max
    ngx_pool_cleanup_t   *cleanup; //        
    ngx_log_t            *log;//    
};

메모리 풀 조작
1. 메모리 풀 생 성
메모리 풀 생 성 함수 ngxcreate_풀 로 완성.코드 는 다음 과 같다.
#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)

#define NGX_DEFAULT_POOL_SIZE    (16 * 1024)

#define NGX_POOL_ALIGNMENT       16
#define NGX_MIN_POOL_SIZE                                                     \
    ngx_align((sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t)),            \
              NGX_POOL_ALIGNMENT)


typedef void (*ngx_pool_cleanup_pt)(void *data);  //       

typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;

struct ngx_pool_cleanup_s {
    ngx_pool_cleanup_pt   handler;
    void                 *data;
    ngx_pool_cleanup_t   *next;
};


typedef struct ngx_pool_large_s  ngx_pool_large_t;

struct ngx_pool_large_s {
    ngx_pool_large_t     *next;    //         
    void                 *alloc;   //         
};

2. 메모리 탱크 소각
메모리 탱크 폐기 함수 ngxdestroy_pool 완성.
cleanup 링크 를 옮 겨 다 니 며 리 셋 함수 가 있 으 면 리 셋 처리 합 니 다.large 큰 메모리 링크 를 옮 겨 다 니 며 분 배 된 큰 메모리 방출;데이터 블록 을 옮 겨 다 니 는 링크 는 분 배 된 작은 메모리 를 방출 합 니 다.
3. 메모리 풀 초기 화
리 셋 함수 ngxreset_pool 완성.large 링크 의 큰 메모 리 를 방출 하고 데이터 블록 의 last 포인터 를 ngx 로 설정 합 니 다.pool_t 후 생 성 된 위치 와 같 습 니 다.
4. 메모리 할당
메모리 할당 함 수 는 네 개 입 니 다.
void *ngx_palloc(ngx_pool_t *pool, size_t size) void *ngx_pnalloc(ngx_pool_t *pool, size_t size) void *ngx_pcalloc(ngx_pool_t *pool, size_t size) void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)
ngx_palloc 코드 분석 은 다음 과 같다.
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;

    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    if (p == NULL) {
        return NULL;
    }

    p->d.last = (u_char *) p + sizeof(ngx_pool_t);		//  ngx_pool_t    ,           
    p->d.end = (u_char *) p + size;						//          
    p->d.next = NULL;
    p->d.failed = 0;

    size = size - sizeof(ngx_pool_t);					//         ngx_pool_t      (40B)
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;  //      4095

    p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;

    return p;
}
ngx_palloc_block 함수 분석 은 다음 과 같다.
주의: 이 함수 가 메모리 하 나 를 분배 한 후 last 포인터 가 가리 키 는 것 은 ngx 입 니 다.pool_data_t 구조 체 (16B) 이후 데이터 구역 의 시작 위치 이 고 메모리 풀 을 만 드 는 것 은 ngx pool t 구조 체 이후 데이터 구역 의 시작 위 치 를 가리킨다.
5. 메모리 사용
ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p)
이 함 수 는 large 링크 에서 분 배 된 메모리 만 방출 합 니 다.
6, 등록 cleanup
함수 ngx pool cleanup t * ngx pool cleanup add (ngx pool t * p, size t size) 로 완 성 됩 니 다.

좋은 웹페이지 즐겨찾기