NAME

posix_memalign, aligned_alloc, memalign, valloc, pvalloc - 정렬된 메모리 할당하기

SYNOPSIS

#include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
void *valloc(size_t size);

#include <malloc.h>

void *memalign(size_t alignment, size_t size);
void *pvalloc(size_t size);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

posix_memalign():
_POSIX_C_SOURCE >= 200112L
aligned_alloc():
_ISOC11_SOURCE
valloc():
glibc 2.12부터:
(_XOPEN_SOURCE >= 500) && !(_POSIX_C_SOURCE >= 200112L)
|| /* glibc 2.19부터: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
glibc 2.12 전:
_BSD_SOURCE || _XOPEN_SOURCE >= 500

DESCRIPTION

posix_memalign() 함수는 size 바이트를 할당하여 할당한 메모리의 주소를 *memptr에 넣는다. alignment는 2의 거듭제곱이어야 하며 sizeof(void *)의 배수여야 한다. 할당된 메모리의 주소가 alignment의 배수가 된다. 그 주소를 이후 free(3)에 무사히 전달할 수 있다. size가 0인 경우 *memptr에 들어가는 값은 NULL이거나 어떤 고유한 포인터 값이다.

구식 함수 memalign()size 바이트를 할당하여 할당된 메모리에 대한 포인터를 반환한다. 메모리 주소가 alignment의 배수가 된다. alignment는 2의 거듭제곱이어야 한다.

aligned_alloc() 함수는 memalign()과 동일하되 sizealignment의 배수여야 한다는 제약이 추가된다.

구식 함수 valloc()size 바이트를 할당하여 할당된 메모리에 대한 포인터를 반환한다. 메모리 주소가 페이지 크기의 배수가 된다. memalign(sysconf(_SC_PAGESIZE),size)와 동등하다.

구식 함수 pvalloc()valloc()과 유사하되 할당 크기를 시스템 페이지 크기의 배수로 올림 한다.

이 함수들 모두 메모리를 0으로 채우지 않는다.

RETURN VALUE

성공 시 aligned_alloc(), memalign(), valloc(), pvalloc()은 할당한 메모리에 대한 포인터를 반환한다. 오류 시 NULL을 반환하며 오류를 나타내도록 errno를 설정한다.

posix_memalign()은 성공 시 0을 반환하고 실패 시 다음 절에 나열한 오류 값들 중 하나를 반환한다. errno 값은 설정하지 않는다. 리눅스에서는 (그리고 다른 시스템들에서는) 실패 시 posix_memalign()memptr을 변경하지 않는다. 이런 동작 방식을 표준화한 요구 사항이 POSIX.1-2008 TC2에 추가되었다.

ERRORS

EINVAL
alignment 인자가 2의 거듭제곱이 아니거나 sizeof(void *)의 배수가 아니다.
ENOMEM
할당 요청을 충족할 충분한 메모리가 없다.

VERSIONS

적어도 glibc 2.0부터 memalign(), valloc(), pvalloc() 함수가 사용 가능했다.

glibc 버전 2.16에서 aligned_alloc() 함수가 추가되었다.

glibc 2.1.91부터 posix_memalign() 함수가 사용 가능하다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
aligned_alloc(), memalign(), posix_memalign() 스레드 안전성 MT-Safe
valloc(), pvalloc() 스레드 안전성 MT-Unsafe init

CONFORMING TO

valloc() 함수는 3.0BSD에서 등장했다. 4.3BSD에서 구식으로, 그리고 SUSv2에서 legacy로 적고 있다. POSIX.1에는 등장하지 않는다.

pvalloc() 함수는 GNU 확장이다.

memalign() 함수는 SunOS 4.1.3에서 등장하지만 4.4BSD에는 없다.

posix_memalign()은 POSIX.1d에서 온 것이며 POSIX.1-2001 및 POSIX.1-2008에 명세되어 있다.

aligned_alloc() 함수는 C11 표준에 명세되어 있다.

헤더

posix_memalign()<stdlib.h>에 선언되어 있다는 것에는 모두가 동의한다.

일부 시스템에서는 memalign()<malloc.h>가 아니라 <stdlib.h>에 선언되어 있다.

SUSv2에 따르면 valloc()<stdlib.h>에 선언되어 있다. glibc에서는 <malloc.h>에서 선언하며, 적절한 기능 확인 매크로가 정의되어 있으면 (위 참고) <stdlib.h>에서도 선언한다.

NOTES

여러 시스템에서 가령 블록 장치 직접 I/O에 쓰는 버퍼들에 정렬 제약이 있다. POSIX에서는 어떤 정렬이 필요한지 알려 주는 pathconf(path,_PC_REC_XFER_ALIGN) 호출을 명세한다. 그러면 posix_memalign()을 사용해 이런 요구 사항을 충족시킬 수 있다.

posix_memalign()alignment가 위에 상술한 요구 사항에 맞는지 검사한다. memalign()alignment 인자가 올바른지 검사하지 않을 수도 있다.

POSIX에서는 posix_memalign()에게서 얻은 메모리를 free(3)로 해제할 수 있어야 한다고 요구한다. 일부 시스템에서는 memalign()이나 valloc()으로 할당한 메모리를 회수하기 위한 방법을 제공하지 않는다. (malloc(3)에게서 얻은 포인터만 free(3)에 줄 수 있는데 가령 memalign()에서 malloc(3)을 호출해서 얻은 값을 정렬하게 되기 때문이다.) glibc 구현에서는 위 함수들 중 무엇으로 얻은 메모리든지 free(3)로 회수할 수 있다.

glibc의 malloc(3)은 항상 8바이트에 정렬된 메모리 주소를 반환한다. 따라서 더 큰 정렬 값이 필요할 때만 이 함수들을 쓰면 된다.

SEE ALSO

brk(2), getpagesize(2), free(3), malloc(3)


2021-03-22