ngnix 소스 코드 분석 - ngxarray_s 메모리 배열
struct ngx_array_s {
void *elts;
ngx_uint_t nelts;
size_t size;
ngx_uint_t nalloc;
ngx_pool_t *pool;
};
메모리 배열 이 라 고 하 는 이 유 는 이 구조 가 ngx 를 사 용 했 기 때 문 입 니 다.pool_t 구조, 메모리 탱크 의 구조, 각 데이터 필드 의 의 미 를 소개 합 니 다.
void *elts; 배열 의 할당 메모리 의 시작 주 소 는 포인터 입 니 다.
nelts 는 배열 에 실제 포 함 된 요소 의 수량 입 니 다.
size_t size 는 단일 요소 의 크기 입 니 다.
ngx_uint_t nalloc; 분 배 된 요소 갯 수
ngx_pool_t *pool;할당 메모리 크기
우선 초기 화 된 소스 코드 를 보 세 요.
static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{
/*
* set "array->nelts" before "array->elts", otherwise MSVC thinks
* that "array->nelts" may be used without having been initialized
*/
array->nelts = 0;
array->size = size;
array->nalloc = n;
array->pool = pool;
array->elts = ngx_palloc(pool, n * size);
if (array->elts == NULL) {
return NGX_ERROR;
}
return NGX_OK;
}
다음은 방법 이다.
/ / 새 배열 용 기 를 만 듭 니 다.
ngx_array_t *ngx_array_create(ngx_pool_t*p,ngx_uint_t n, size_t size);
/ / 배열 용기 소각
voidngx_array_destroy(ngx_array_t *a);
/ / 새로운 요 소 를 배열 용기 에 추가 합 니 다.
void*ngx_array_push(ngx_array_t*a);
void*ngx_array_push_n(ngx_array_t*a,ngx_uint_t n);//n 개의 요소 포인터 되 돌리 기
여기 서 주의해 야 할 것 은, 이전의 ngx 와pool_cleanup_add 처럼,
ngx_array_push 는 메모리 할당 작업 만 할 뿐 되 돌아 오 는 포인터 가 가리 키 는 주 소 를 할당 하 는 등 실제 배열 값 을 추가 해 야 합 니 다.
구체 적 인 push 작업 의 실현 은:
1. 먼저 nalloc 가 nelts 와 같 는 지 판단 합 니 다. 즉, 배열 이 미리 분 배 된 공간 이 꽉 찼 습 니 다. 꽉 차지 않 으 면 주 소 를 계산 하여 지침 을 되 돌려 줍 니 다.
2. 만약 에 꽉 찼 다 면 먼저 우리 의 pool 에 있 는 현재 링크 노드 에 남 은 공간 이 있 는 지 판단 하고 있 으 면 현재 pool 링크 노드 에 메모 리 를 분배 하고 돌아 갑 니 다.
3. 현재 링크 노드 에 충분 한 공간 이 없 으 면 ngx 를 사용 합 니 다.palloc 하나 재배 치 2
4. 이전 배열 공간 크기 의 배열 에서 데 이 터 를 옮 기 고 새 주소 의 지침 을 되 돌려 줍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.