posix_memalign(3) - wariua/manpages-ko GitHub Wiki

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>>
((λΉ„ν‘œμ€€) 헀더 파일 <malloc.h>도 valloc() 선언을 λ“œλŸ¬λ‚Έλ‹€. μ–΄λ–€ κΈ°λŠ₯ 확인 λ§€ν¬λ‘œλ„ ν•„μš”ν•˜μ§€ μ•Šλ‹€.)

DESCRIPTION

posix_memalign() ν•¨μˆ˜λŠ” size λ°”μ΄νŠΈλ₯Ό ν• λ‹Ήν•˜μ—¬ ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό *memptr에 λ„£λŠ”λ‹€. ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œκ°€ alignment의 λ°°μˆ˜κ°€ λœλ‹€. alignmentλŠ” 2의 κ±°λ“­μ œκ³±μ΄μ–΄μ•Ό ν•˜λ©° sizeof(void *)의 λ°°μˆ˜μ—¬μ•Ό ν•œλ‹€. sizeκ°€ 0인 경우 *memptr에 λ„£λŠ” 값은 NULLμ΄κ±°λ‚˜, 이후 free(3)에 λ¬΄μ‚¬νžˆ 전달할 수 μžˆλŠ” κ³ μœ ν•œ 포인터 값이닀.

ꡬ식 ν•¨μˆ˜ 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-2016에 μΆ”κ°€λ˜μ—ˆλ‹€.

ERRORS

EINVAL
alignment μΈμžκ°€ 2의 κ±°λ“­μ œκ³±μ΄ μ•„λ‹ˆκ±°λ‚˜ sizeof(void *)의 λ°°μˆ˜κ°€ μ•„λ‹ˆλ‹€.
ENOMEM
ν• λ‹Ή μš”μ²­μ„ μΆ©μ‘±ν•  μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬κ°€ μ—†λ‹€.

VERSIONS

λ¦¬λˆ…μŠ€μ˜ λͺ¨λ“  libc λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ—μ„œ 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>에 μ„ μ–Έλ˜μ–΄ μžˆλ‹€. libc 4와 5, 그리고 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)


2019-05-09

⚠️ **GitHub.com Fallback** ⚠️