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 >= 200112Laligned_alloc():_ISOC11_SOURCEvalloc():-
- 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()과 동일하되 size가 alignment의 배수여야 한다는 제약이 추가된다.
구식 함수 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
EINVALalignment인자가 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