MALLOC(9)

,

명칭
malloc, MALLOC, free, FREE - 카네르메모리마네이지먼트르틴

서식
<sys/types.h> <sys/malloc.h> void * malloc(unsigned long size, struct malloc_type *type, int flags) MALLOC(space, cast, unsigned long size, struct malloc_type *type, int flags) void free(void *addr, struct malloc_type *type) FREE(void *addr, struct malloc_type *type) void * realloc(void *addr, unsigned long size, struct malloc_type *type, int flags) void * reallocf(void *addr, unsigned long size, struct malloc_type *type, int flags)

해설
malloc() 함수는 커널 address 공간의 초기화되어 있지 않은 메모리를 size 그리고 지정된 크기의 1 개의 오브젝트로서 할당합니다.

free() 하 malloc() 그리고 먼저 할당할 수 있고 있었다 addr 의 주소의 메모리를 재사용하기 위해서 해방합니다. 메모리는 0 에 클리어 되지 않습니다. addr 하지만 NULL 의 경우, free() (은)는 아무것도 하지 않습니다.

realloc() 함수는, 이전에 할당할 수 있어 addr 그리고 참조되는 메모리의 크기를 size 바이트로 변경합니다. 메모리의 내용은, 신사이즈와 구사이즈의 작은 (분)편까지는, 무변경이 됩니다. 반환값은 addr (와)과 다를지도 모르는 것에 주의해 주세요. 요구된 메모리가 할당 불능의 경우, NULL 하지만 돌려주어 addr 그리고 참조되는 메모리는 정당해 무변경인 채됩니다. addr 하지만 NULL 의 경우, realloc() 함수는 지정된 크기의 malloc() (와)과 동등하게 행동합니다.

reallocf() 함수 호출은, realloc 함수 호출과 완전히 같습니다만, 요구된 메모리를 할당 불능의 경우에 건네받은 포인터의 메모리를 해방하는 점이 다릅니다.

매크로판의 MALLOC() (은)는 기능적으로는

    (space) = (cast) malloc((u_long)(size), type, flags)

(와)과 동등해, 매크로판 FREE() 하

    free((addr), type)

(와)과 동등합니다. 표준 C프로그램 라이브러리의 동의 함수 (malloc(3)) 과는 달리, 커널 버젼은 더욱 2 개(살)의 당겨 수를 취합니다. 당겨 수 flags 하 malloc() 의 조작상의 특성을 이하와 같이 간주합니다.

M_NOWAIT
    리소스의 부족을 위해 즉시 요구를 채울 수가 없는 경우는, malloc(), realloc(), reallocf() 하지만 NULL (을)를 돌려주도록(듯이) 합니다. 통상은, 다른 프로세스에 의한 리소스의 해방을 기다리기 위해서(때문에) sleeve 상태로 됩니다. 이 플래그가 세트 되고 있으면, malloc() (은)는 블록 하지 않고 NULL (을)를 돌려줍니다. M_WAITOK 하지만 0 에 정의되고 있는 것에 주의해 주세요. 이것은 블로킹 조작이 디폴트라고 하는 것입니다. 세치기 문맥에서의 동작시에는 M_NOWAIT 하지만 필요한 것에도 주의해 주세요.

M_ASLEEP
    리소스의 부족을 위해 즉시 요구를 채울 수가 없는 경우는, malloc(), realloc(), reallocf() 하지만 asleep() (을)를 부르도록(듯이) 합니다. M_ASLEEP 의 단독으로의 사용은 실용적이지 않고, 항상 M_NOWAIT (와)과의 논리합(OR)을 취해 본함수 에 asleep() (을)를 부르게 해 즉시 NULL (을)를 돌려주게 합니다. 호출측이 있는 시점에서 await() (을)를 불러, 할당의 리트라이를 하는 것이 기대되고 있습니다. 바로 그 routine에 의존해, 호출측에서 일시적인 실패를 상위에 연쇄적으로 전반 해, 실제로 본함수 하지만 큐에 넣은 비동기의 웨이트를 블록 한다 몇개의 다른 고레벨 routine를 가질 것을 결정할 수도 있습니다.

M_WAITOK
    리소스를 기다리는 것이 가능(OK)인 것을 나타냅니다. 형편이 나쁜 것에 0 으로 정의되고 있으므로, 직접 이 값에 대해서 비교하거나 플래그로서 논리적(AND)을 취하거나 하지 않게 주의받지 않으면 안됩니다. 디폴트의 조작은 메모리의 할당이 성공할 때까지 블록 합니다. M_NOWAIT 하지만 지정되면(자) malloc(), realloc(), reallocf() (은)는 단지 NULL (을)를 돌려줄 수가 있습니다.

M_USE_RESERVE
    요구된 메모리를 획득하기 위해서, 시스템이 리저브 area를 사용해도 좋은 일을 나타냅니다. 이 옵션은 이전에는 M_KERNEL 로 불리고 있었습니다만, 보다 명시적으로 개명되었습니다. 이 옵션은 경시되고 있어, 커널로부터 서서히 삭제되고 있습니다. 그 때문에, 새로운 프로그래밍에서는 사용되지 않게 해야 합니다.

당겨 수 type (은)는 메모리의 이용 방법이 통계를 내기 (위해)때문에와 간단한 사니티체크를 위해서(때문에) 사용되고 있습니다. 이 통계는 ‘vmstat -m’ 그리고 조사할 수가 있습니다.

type 하 MALLOC_DECLARE() (와)과 MALLOC_DEFINE() 매크로를 통해서 malloc_type_t typedef 를 사용해 정의됩니다.

    /* sys/something/foo_extern.h */
    MALLOC_DECLARE(M_FOOBUF);
    /* sys/something/foo_main.c */
    MALLOC_DEFINE(M_FOOBUF, "foobuffers",
                  "Buffers to foo data into the ether");
    /* sys/something/foo_subr.c */
    ...
    MALLOC(buf, struct foo_buf *, sizeof *buf, M_FOOBUF, M_NOWAIT);

반환값
malloc(), realloc(), reallocf() (은)는 모든 타입의 오브젝트의 격납에 적절한 것 같게 정렬되었다 커널 가상 주소를 돌려주는지, 또는 요구가 만족해 오지 않고 (즉 M_NOWAIT 하지만 세트 되고 있는 것을 의미합니다)에 NULL (을)를 돌려줍니다. M_ASLEEP 하지만 세트 되고 있어 함수 하지만 NULL (을)를 돌려주는 경우, 부작용으로서 asleep() 하지만 불려 갑니다.

실장에 관한 주
1 페이지까지의 요구에 대해, 메모 리어 locator는, 2 의 누승의 크기의 양을 할당합니다. 보다 큰 요구에 대해서는, 1 개 이상의 페이지를 할당할 수 있습니다. 이 동작에 의존하고는 되지 않습니다만, 이 정보가 메모리 사용 효율의 최적화에 유용할지도 모릅니다.

관련 항목
vmstat(8)

진단
DIAGNOSTIC 배치 옵션을 붙여 컴파일 된 커널은, 할당할 수 있었던 area 이외에의 기입이나 malloc() 함수와 free() 함수의 불균형인 호출등에 의해 생긴 메모리 부정의 검출을 시도합니다. 일관성 체크의 실패는 패닉 또는 시스템 콘솔 메세지를 출력합니다.

•   panic: “malloc: bogus type”
•   panic: “malloc: allocation too large”
•   panic: “malloc: wrong bucket”
•   panic: “malloc: lost data”
•   panic: “free: address 0x%x out of range”
•   panic: “free: type %d out of range”
•   panic: “free: unaligned addr <description of object>”
•   panic: “free: item modified”
•   panic: “free: multiple free[s]”
•   “Data modified on freelist: <description of object>”