posix_fadvise(2) - wariua/manpages-ko GitHub Wiki

NAME

posix_fadvise - 파일 데이터 μ ‘κ·Ό 방식을 미리 μ„ μ–Έν•˜κΈ°

SYNOPSIS

#include <fcntl.h>

int posix_fadvise(int fd, off_t offset, off_t len, int advice);

glibc κΈ°λŠ₯ 확인 맀크둜 μš”κ±΄ (feature_test_macros(7) μ°Έκ³ ):

posix_fadvise():
_POSIX_C_SOURCE >= 200112L

DESCRIPTION

ν”„λ‘œκ·Έλž¨μ—μ„œ posix_fadvise()λ₯Ό μ‚¬μš©ν•΄ ν–₯ν›„ νŠΉμ • νŒ¨ν„΄μœΌλ‘œ 파일 데이터에 μ ‘κ·Όν•˜κ² λ‹€λŠ” μ˜λ„λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€. 그러면 컀널이 μ μ ˆν•œ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•  수 있게 λœλ‹€.

fdκ°€ κ°€λ¦¬ν‚€λŠ” 파일 λ‚΄μ—μ„œ offsetμ—μ„œ μ‹œμž‘ν•΄ len λ°”μ΄νŠΈλ§ŒνΌ (len이 0이면 파일 λκΉŒμ§€) μ΄μ–΄μ§€λŠ” (κΌ­ μ‘΄μž¬ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹Œ) μ˜μ—­μ— adviceλ₯Ό μ μš©ν•œλ‹€. adviceμ—λŠ” ꡬ속λ ₯이 μ—†μœΌλ©° κ·Έμ € μ‘μš© μž…μž₯μ—μ„œμ˜ μ˜ˆμƒμΌ 뿐이닀.

advice에 λ‹€μŒ 값이 κ°€λŠ₯ν•˜λ‹€.

POSIX_FADV_NORMAL
μ§€μ •ν•œ 데이터에 λŒ€ν•œ μ ‘κ·Ό νŒ¨ν„΄μ— κ΄€ν•΄ μ‘μš©μ—μ„œ ν•΄ 쀄 쑰언이 μ—†μŒμ„ λ‚˜νƒ€λ‚Έλ‹€. μ—΄λ¦° νŒŒμΌμ— 아무 쑰언도 μ£Όμ§€ μ•ŠμœΌλ©΄ 기본으둜 μƒμ •ν•˜λŠ” 값이닀.
POSIX_FADV_SEQUENTIAL
μ‘μš©μ—μ„œ μ§€μ •ν•œ 데이터에 순차적으둜 (μ˜€ν”„μ…‹μ΄ μž‘μ€ 데이터λ₯Ό λ¨Όμ € μ½λŠ” μ‹μœΌλ‘œ) μ ‘κ·Όν•  μ˜ˆμ •μ΄λ‹€.
POSIX_FADV_RANDOM
μ§€μ •ν•œ 데이터에 μž„μ˜ μˆœμ„œλ‘œ μ ‘κ·Όν•˜λ € ν•œλ‹€.
POSIX_FADV_NOREUSE

μ§€μ •ν•œ 데이터에 ν•œ 번만 μ ‘κ·Όν•˜λ € ν•œλ‹€.

2.6.18 μ „μ˜ μ»€λ„μ—μ„œ POSIX_FADV_NOREUSEλŠ” POSIX_FADV_WILLNEED와 λ™μž‘μ΄ κ°™μ•˜λ‹€. λ²„κ·Έμ˜€λ˜ 것 κ°™λ‹€. 컀널 2.6.18λΆ€ν„° 이 ν”Œλž˜κ·ΈλŠ” no-op이닀.

POSIX_FADV_WILLNEED

μ§€μ •ν•œ 데이터에 μ‘°λ§Œκ°„ μ ‘κ·Όν•˜λ € ν•œλ‹€.

POSIX_FADV_WILLNEEDλŠ” μ§€μ •ν•œ μ˜μ—­μ„ νŽ˜μ΄μ§€ μΊμ‹œλ‘œ 읽어 λ“€μ΄λŠ” 논블둝 λ™μž‘μ„ κ°œμ‹œν•œλ‹€. 가상 λ©”λͺ¨λ¦¬ λΆ€ν•˜μ— 따라 μ½λŠ” 데이터 양을 컀널이 쀄일 μˆ˜λ„ μžˆλ‹€. (보톡 λͺ‡ λ©”κ°€λ°”μ΄νŠΈ μ •λ„λŠ” μ™„μ „νžˆ 좩쑱되고 κ·Έ μ΄μƒμœΌλ‘œλŠ” 잘 μ“°μ§€ μ•ŠλŠ”λ‹€.)

POSIX_FADV_DONTNEED

μ§€μ •ν•œ 데이터에 당뢄간은 μ ‘κ·Όν•˜μ§€ μ•Šμ„ 것이닀.

POSIX_FADV_DONTNEEDλŠ” μ§€μ •ν•œ μ˜μ—­κ³Ό μ—°κ³„λœ 캐싱 된 νŽ˜μ΄μ§€λ“€μ„ ν•΄μ œ μ‹œλ„ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 큰 νŒŒμΌμ„ 슀트리밍 ν•  λ•Œ μœ μš©ν•˜λ‹€. ν”„λ‘œκ·Έλž¨μ—μ„œ 이미 μ‚¬μš©ν•œ 데이터λ₯Ό μΊμ‹œμ—μ„œ ν•΄μ œν•˜λΌκ³  주기적으둜 μ»€λ„μ—κ²Œ μš”μ²­ν•  수 있고, 그러면 μΊμ‹œ λ‚΄μ˜ 더 μœ μš©ν•œ νŽ˜μ΄μ§€λ“€μ΄ νκΈ°λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

νŽ˜μ΄μ§€ μΌλΆ€λ§Œ νκΈ°ν•˜λŠ” μš”μ²­μ€ λ¬΄μ‹œν•œλ‹€. λΆˆν•„μš”ν•œ 데이터λ₯Ό νκΈ°ν•˜λŠ” 것보닀 ν•„μš”ν•œ 데이터λ₯Ό λ³΄μ‘΄ν•˜λŠ” μͺ½μ΄ μ€‘μš”ν•˜λ‹€. 데이터 폐기λ₯Ό κ³ λ €ν•˜κ²Œ ν•˜λ €λ©΄ offsetκ³Ό len이 νŽ˜μ΄μ§€μ— μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

μ§€μ • μ˜μ—­ λ‚΄μ˜ λ³€κ²½λœ νŽ˜μ΄μ§€λ“€μ„ κ΅¬ν˜„μ²΄κ°€ 기반 μž₯치둜 κΈ°λ‘ν•˜λ € μ‹œλ„ν•  μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ 이λ₯Ό 보μž₯ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. 기둝 μ•ˆ 된 λ³€κ²½ νŽ˜μ΄μ§€κ°€ 있으면 ν•΄μ œλ˜μ§€ μ•Šμ„ 것이닀. λ³€κ²½λœ νŽ˜μ΄μ§€κ°€ ν•΄μ œλ˜κ²Œ ν•˜κ³  μ‹ΆμœΌλ©΄ μ‘μš©μ—μ„œ λ¨Όμ € fsync(2)λ‚˜ fdatasync(2)λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•  것이닀.

RETURN VALUE

성곡 μ‹œ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ 였λ₯˜ 번호λ₯Ό λ°˜ν™˜ν•œλ‹€.

ERRORS

EBADF
fd μΈμžκ°€ μœ νš¨ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ•„λ‹ˆλ‹€.
EINVAL
advice에 μœ νš¨ν•˜μ§€ μ•Šμ€ 값을 μ§€μ •ν–ˆλ‹€.
ESPIPE
μ§€μ •ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ νŒŒμ΄ν”„λ‚˜ FIFOλ₯Ό 가리킀고 μžˆλ‹€. (POSIXμ—μ„œ λͺ…μ„Έν•˜λŠ” 였λ₯˜λŠ” ESPIPEμ΄μ§€λ§Œ 컀널 버전 2.6.16 μ „μ˜ λ¦¬λˆ…μŠ€λŠ” 이 경우 EINVAL을 λ°˜ν™˜ν–ˆλ‹€.)

VERSIONS

λ¦¬λˆ…μŠ€ 2.5.60μ—μ„œ 컀널 지원이 처음 λ“±μž₯ν–ˆλ‹€. 기반 μ‹œμŠ€ν…œ 호좜의 이름이 fadvise64()μ˜€λ‹€. glibc 버전 2.2λΆ€ν„° 래퍼 ν•¨μˆ˜ posix_fadvise()λ₯Ό 톡해 라이브러리 지원이 μ΄λ€„μ‘Œλ‹€.

λ¦¬λˆ…μŠ€ 3.18λΆ€ν„° 기반 μ‹œμŠ€ν…œ 호좜 지원이 선택적이닀. CONFIG_ADVISE_SYSCALLS ꡬ성 μ˜΅μ…˜ 섀정에 따라 μ •ν•΄μ§„λ‹€.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008. 참고둜 POSIX.1-2003 TC1μ—μ„œ len 인자의 νƒ€μž…μ΄ size_tμ—μ„œ off_t둜 λ°”λ€Œμ—ˆλ‹€.

NOTES

λ¦¬λˆ…μŠ€μ—μ„œ POSIX_FADV_NORMAL은 미리 읽기 μœˆλ„λ₯Ό 기반 μž₯μΉ˜λ³„ κΈ°λ³Έκ°’μœΌλ‘œ μ„€μ •ν•œλ‹€. POSIX_FADV_SEQUENTIAL은 두 λ°° 크기둜 λ§Œλ“€κ³  POSIX_FADV_RANDOM은 파일 미리 읽기λ₯Ό μ™„μ „νžˆ λˆλ‹€. 이런 변경은 μ§€μ •ν•œ μ˜μ—­λ§Œμ΄ μ•„λ‹ˆλΌ 파일 전체에 영ν–₯을 λΌμΉœλ‹€. (단, 동일 νŒŒμΌμ— λŒ€ν•œ λ‹€λ₯Έ μ—΄λ¦° 파일 핸듀은 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.)

proc(5)μ—μ„œ κΈ°μˆ ν•˜λŠ” /proc/sys/vm/drop_caches μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 컀널 버퍼 μΊμ‹œ λ‚΄μš©μ„ λΉ„μšΈ 수 μžˆλ‹€.

νŒŒμΌμ„ μ—΄μ–΄μ„œ mmap(2)으둜 λ§΅ ν•˜κ³ μ„œ κ·Έ 맀핑에 mincore(2)λ₯Ό μ μš©ν•˜λ©΄ 파일의 μ–΄λŠ νŽ˜μ΄μ§€λ“€μ΄ 버퍼 μΊμ‹œ μ•ˆμ— μƒμ£Όν•˜κ³  μžˆλŠ”μ§€μ— λŒ€ν•œ μŠ€λƒ…μƒ·μ„ 얻을 수 μžˆλ‹€.

C 라이브러리/컀널 차이

C 라이브러리의 래퍼 ν•¨μˆ˜ 이름이 posix_fadvise()이닀. 기반 μ‹œμŠ€ν…œ 호좜의 이름은 fadvise64()이닀. (일뢀 μ•„ν‚€ν…μ²˜μ—μ„œλŠ” fadvise64_64()이닀.) 두 μ‹œμŠ€ν…œ 호좜의 μ°¨μ΄λŠ” μ „μžμ—μ„œ len 인자의 νƒ€μž…μ΄ size_t라고 μƒμ •ν•˜λŠ” 반면 ν›„μžμ—μ„œλŠ” loff_tλ₯Ό κΈ°λŒ€ν•œλ‹€λŠ” 점이닀.

μ•„ν‚€ν…μ²˜λ³„ 변이

μ–΄λ–€ μ•„ν‚€ν…μ²˜μ—μ„œλŠ” 64λΉ„νŠΈ 인자λ₯Ό μ μ ˆν•œ λ ˆμ§€μŠ€ν„° μŒμ— 맞좰 λ„£μ–΄μ•Ό ν•œλ‹€. (μžμ„Έν•œ λ‚΄μš©μ€ syscall(2) μ°Έκ³ .) 그런 μ•„ν‚€ν…μ²˜μ—μ„œ SYNOPSIS에 μžˆλŠ” posix_fadvise() 호좜 μ‹œκ·Έλ„ˆμ²˜λŠ” fd와 offset 인자 사이 νŒ¨λ”©μœΌλ‘œ λ ˆμ§€μŠ€ν„° ν•˜λ‚˜λ₯Ό λ‚­λΉ„ν•˜κ²Œ λ§Œλ“€ 것이닀. κ·Έλž˜μ„œ 그런 μ•„ν‚€ν…μ²˜λ“€μ—μ„œλŠ” 인자 μˆœμ„œλ₯Ό 적절히 λ°”κΎΈκ³  λ‚˜λ¨Έμ§€λŠ” posix_fadvise()와 μ •ν™•ν•˜κ²Œ λ™μΌν•œ 버전을 μ •μ˜ν•œλ‹€.

예λ₯Ό λ“€μ–΄ λ¦¬λˆ…μŠ€ 2.6.14λΆ€ν„° ARMμ—λŠ” λ‹€μŒ μ‹œμŠ€ν…œ 호좜이 μžˆλ‹€.

long arm_fadvise64_64(int fd, int advice,
                      loff_t offset, loff_t len);

일반적으둜 μ‘μš©μ—κ²ŒλŠ” 이런 μ•„ν‚€ν…μ²˜λ³„ μ„ΈλΆ€ 사항이 감좰져 μžˆλ‹€. glibc의 posix_fadvise() 래퍼 ν•¨μˆ˜μ—μ„œ μ μ ˆν•œ μ•„ν‚€ν…μ²˜λ³„ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 뢈러 μ€€λ‹€.

BUGS

컀널 2.6.6 μ „μ—μ„œλŠ” len을 0으둜 μ§€μ •ν•˜λ©΄ 이λ₯Ό "파일 λκΉŒμ§€ 전체 λ°”μ΄νŠΈ"둜 ν•΄μ„ν•˜μ§€ μ•Šκ³  말 κ·ΈλŒ€λ‘œ "0λ°”μ΄νŠΈ"둜 ν•΄μ„ν–ˆλ‹€.

SEE ALSO

fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)


2018-03-06

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