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

NAME

madvise - λ©”λͺ¨λ¦¬ μ‚¬μš©μ— λŒ€ν•œ μ‘°μ–Έ μ£ΌκΈ°

SYNOPSIS

#include <sys/mman.h>

int madvise(void *addr, size_t length, int advice);

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

madvise():
glibc 2.19λΆ€ν„°
_DEFAULT_SOURCE
glibc 2.19 및 이전:
_BSD_SOURCE

DESCRIPTION

madvise() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•΄ μ£Όμ†Œ addrμ—μ„œ μ‹œμž‘ν•˜κ³  크기가 length λ°”μ΄νŠΈμΈ μ£Όμ†Œ λ²”μœ„μ— λŒ€ν•΄ μ»€λ„μ—κ²Œ μ‘°μ–Έ λ‚΄μ§€ μ§€μ‹œλ₯Ό ν•œλ‹€. λŒ€λΆ€λΆ„μ˜ 경우 κ·Έ μ‘°μ–Έμ˜ λͺ©μ μ€ μ‹œμŠ€ν…œ λ‚΄μ§€ μ‘μš©μ˜ μ„±λŠ₯을 κ°œμ„ ν•˜λŠ” 것이닀.

μ²˜μŒμ— 이 μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ λ‹€λ₯Έ μ—¬λŸ¬ κ΅¬ν˜„μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯ν•œ "전톡적인" advice 값듀을 μ§€μ›ν–ˆλ‹€. (참고둜 madvise()λŠ” POSIX에 λͺ…μ„Έλ˜μ–΄ μžˆμ§€ μ•Šλ‹€.) 이후에 λ¦¬λˆ…μŠ€ μ „μš© advice 값듀이 μ—¬λŸ¬ κ°€μ§€ μΆ”κ°€λ˜μ—ˆλ‹€.

전톡적인 μ‘°μ–Έ κ°’

μ‘μš©μ—μ„œ μ•„λž˜ λ‚˜μ—΄λœ advice 값듀을 μ΄μš©ν•˜μ—¬ μ–΄λ–€ λ§΅ 된 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‚˜ 곡유 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ–΄λ–»κ²Œ μ‚¬μš©ν•  μ˜ˆμ •μΈμ§€ μ»€λ„μ—κ²Œ μ•Œλ € 쀄 수 μžˆλ‹€. 그러면 μ»€λ„μ—μ„œ μ μ ˆν•œ 미리 읽기 및 μΊμ‹œ 기법을 선택할 수 μžˆλ‹€. 이 advice 값듀은 (MADV_DONTNEEDλ₯Ό μ œμ™Έν•˜κ³ ) μ‘μš©μ˜ λ™μž‘ 결과에 영ν–₯을 μ£Όμ§€ μ•ŠμœΌλ©° μ„±λŠ₯μ—λ§Œ 영ν–₯을 끼칠 수 μžˆλ‹€. μ—¬κΈ° λ‚˜μ—΄λœ advice 값듀은 λͺ¨λ‘ POSIX λͺ…μ„Έ ν•¨μˆ˜μΈ posix_madvise(3)에 μœ μ‚¬ν•œ ν•­λͺ©μ΄ 있으며 MADV_DONTNEEDλ₯Ό μ œμ™Έν•˜κ³  κ°’μ˜ μ˜λ―Έκ°€ κ°™λ‹€.

쑰언을 λ‚˜νƒ€λ‚΄λŠ” advice μΈμžλŠ” λ‹€μŒ 쀑 ν•˜λ‚˜μ΄λ‹€.

MADV_NORMAL
νŠΉλ³„ν•œ 처리 μ—†μŒ. 기본이닀.
MADV_RANDOM
μž„μ˜ μˆœμ„œλ‘œ νŽ˜μ΄μ§€ μ°Έμ‘°λ₯Ό ν•  μ˜ˆμ •. (λ”°λΌμ„œ 미리 읽기가 ν‰μƒμ‹œλ³΄λ‹€ μ“Έλͺ¨κ°€ 없을 수 μžˆλ‹€.)
MADV_SEQUENTIAL
순차 μˆœμ„œλ‘œ νŽ˜μ΄μ§€ μ°Έμ‘°λ₯Ό ν•  μ˜ˆμ •. (λ”°λΌμ„œ μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ„ 적극적으둜 미리 읽기 ν•  수 있으며 μ ‘κ·Ό 후에 λ°”λ‘œ ν•΄μ œν•  μˆ˜λ„ μžˆλ‹€.)
MADV_WILLNEED
μ‘°λ§Œκ°„ μ ‘κ·Όν•  μ˜ˆμ •. (λ”°λΌμ„œ νŽ˜μ΄μ§€λ“€μ„ 미리 읽어 λ‘λŠ” 게 쒋을 μˆ˜λ„ μžˆλ‹€.)
MADV_DONTNEED

당뢄간은 μ ‘κ·Όν•  μ˜ˆμ • μ—†μŒ. (μ‘μš©μ—μ„œ ν•œλ™μ•ˆ κ·Έ λ²”μœ„μ— 볼일이 μ—†μœΌλ―€λ‘œ μ»€λ„μ—μ„œ κ±°κΈ° μ—°κ³„λœ μžμ›μ„ ν•΄μ œν•  수 μžˆλ‹€.)

MADV_DONTNEED λ™μž‘ 성곡 ν›„μ—λŠ” μ§€μ •ν•œ μ˜μ—­μ—μ„œμ˜ λ©”λͺ¨λ¦¬ μ ‘κ·Ό λ™μž‘ κ²°κ³Όκ°€ 바뀐닀. κ·Έ λ²”μœ„ λ‚΄ νŽ˜μ΄μ§€μ— λŒ€ν•œ μ΄ν›„μ˜ 접근이 성곡은 ν•˜μ§€λ§Œ (곡유 파일 λ§€ν•‘, 곡유 읡λͺ… λ§€ν•‘, μ‹œμŠ€ν…œ V 곡유 λ©”λͺ¨λ¦¬ μ„Έκ·Έλ¨ΌνŠΈ 같은 shmem 기반 기법인 경우) 기반 λ§΅ 파일의 μ΅œμ‹  λ‚΄μš©μœΌλ‘œ λ©”λͺ¨λ¦¬ λ‚΄μš©μ„ λ‹€μ‹œ μ±„μš°κ²Œ λ˜κ±°λ‚˜, 읡λͺ… λΉ„κ³΅μœ  맀핑인 경우 zero-fill-on-demand νŽ˜μ΄μ§€κ°€ λœλ‹€.

참고둜 곡유 맀핑에 MADV_DONTNEED 적용 μ‹œ λ²”μœ„ λ‚΄ νŽ˜μ΄μ§€λ“€μ΄ μ¦‰μ‹œ ν•΄μ œλ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. μ»€λ„μ—μ„œ νŽ˜μ΄μ§€ ν•΄μ œλ₯Ό 자유둜이 μ μ ˆν•œ μ‹œμ μœΌλ‘œ μ—°κΈ°ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 호좜 ν”„λ‘œμ„ΈμŠ€μ˜ 상주 μ§‘ν•© 크기(RSS)λŠ” μ¦‰μ‹œ 쀄어든닀.

κ³ μ •λœ νŽ˜μ΄μ§€, κ±°λŒ€ TLB νŽ˜μ΄μ§€, VM_PFNMAP νŽ˜μ΄μ§€μ— MADV_DONTNEEDλ₯Ό μ μš©ν•  수 μ—†λ‹€. (컀널 λ‚΄λΆ€μš©μΈ VM_PFNMAP ν”Œλž˜κ·Έλ‘œ ν‘œμ‹œλœ νŽ˜μ΄μ§€λŠ” 가상 λ©”λͺ¨λ¦¬ μ„œλΈŒμ‹œμŠ€ν…œμ΄ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” νŠΉμˆ˜ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€. 보톡 μž₯치 λ“œλΌμ΄λ²„μ—μ„œ 그런 νŽ˜μ΄μ§€λ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©μž κ³΅κ°„μœΌλ‘œ λ§΅ ν•œλ‹€.)

λ¦¬λˆ…μŠ€ μ „μš© μ‘°μ–Έ κ°’

λ‹€μŒμ˜ λ¦¬λˆ…μŠ€ μ „μš© advice 값듀은 POSIX에 λͺ…μ„Έλœ posix_madvise(3)에 λŒ€μ‘ ν•­λͺ©μ΄ μ—†μœΌλ©°, λ‹€λ₯Έ κ΅¬ν˜„μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ madvise() μΈν„°νŽ˜μ΄μŠ€μ—λŠ” λŒ€μ‘ ν•­λͺ©μ΄ μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλ‹€. 참고둜 이 λ™μž‘λ“€ 쀑 μΌλΆ€λŠ” λ©”λͺ¨λ¦¬ μ ‘κ·Όμ˜ λ™μž‘ κ²°κ³Όλ₯Ό λ°”κΎΌλ‹€.

MADV_REMOVE (λ¦¬λˆ…μŠ€ 2.6.16λΆ€ν„°)

μ§€μ •ν•œ νŽ˜μ΄μ§€ λ²”μœ„ 및 μ—°κ³„λœ 기반 μ €μž₯ 곡간을 ν•΄μ œν•œλ‹€. 기반 μ €μž₯ κ³΅κ°„μ˜ λŒ€μ‘ν•˜λŠ” λ°”μ΄νŠΈ λ²”μœ„μ— ꡬ멍을 λš«λŠ” 것과 λ™λ“±ν•˜λ‹€. (fallocate(2) μ°Έκ³ .) μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„λ₯Ό 이후에 μ ‘κ·Όν•˜λ©΄ 0이 λ‹΄κΈ΄ λ°”μ΄νŠΈλ“€μ„ 보게 λœλ‹€.

μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„κ°€ 곡유 맡이고 μ“°κΈ° κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. κ³ μ •λœ νŽ˜μ΄μ§€, κ±°λŒ€ TLB νŽ˜μ΄μ§€, VM_PFNMAP νŽ˜μ΄μ§€μ— 이 ν”Œλž˜κ·Έλ₯Ό μ μš©ν•  수 μ—†λ‹€.

초기 κ΅¬ν˜„μ—μ„œλŠ” tmpfs(5)만 MADV_REMOVEλ₯Ό μ§€μ›ν–ˆλ‹€. λ¦¬λˆ…μŠ€ 3.5λΆ€ν„°λŠ” fallocate(2) FALLOC_FL_PUNCH_HOLE λͺ¨λ“œλ₯Ό μ§€μ›ν•˜λŠ” 파일 μ‹œμŠ€ν…œμ΄λ©΄ MADV_REMOVE도 μ§€μ›ν•œλ‹€. hugetlbfsλŠ” EINVAL둜 μ‹€νŒ¨ν•˜λ©° λ‹€λ₯Έ 파일 μ‹œμŠ€ν…œλ“€μ€ EOPNOTSUPP 였λ₯˜λ‘œ μ‹€νŒ¨ν•œλ‹€.

MADV_DONTFORK (λ¦¬λˆ…μŠ€ 2.6.16λΆ€ν„°)
이 λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ„ fork(2) 후에 μžμ‹μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€. fork(2) 후에 λΆ€λͺ¨κ°€ νŽ˜μ΄μ§€μ— μ“°κΈ°λ₯Ό ν•˜λŠ” 경우 copy-on-write λ™μž‘ 방식 λ•Œλ¬Έμ— νŽ˜μ΄μ§€μ˜ 물리적 μœ„μΉ˜κ°€ λ°”λ€ŒλŠ” 것을 λ§‰λŠ” 데 μœ μš©ν•˜λ‹€. (ν•˜λ“œμ›¨μ–΄μ—μ„œ κ·Έ νŽ˜μ΄μ§€λ‘œ DMA ν•˜λŠ” κ²½μš°μ— 그런 νŽ˜μ΄μ§€ μž¬λ°°μΉ˜κ°€ 문제λ₯Ό μΌμœΌν‚¨λ‹€.)
MADV_DOFORK (λ¦¬λˆ…μŠ€ 2.6.16λΆ€ν„°)
MADV_DONTFORK의 효과λ₯Ό λ˜λŒλ¦°λ‹€. fork(2)λ₯Ό 거치며 맀핑을 λ¬Όλ €λ°›λŠ” κΈ°λ³Έ λ™μž‘ 방식을 λ³΅μ›ν•œλ‹€.
MADV_HWPOISON (λ¦¬λˆ…μŠ€ 2.6.32λΆ€ν„°)

addrκ³Ό length둜 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ— μ˜€μ—Ό ν‘œμ‹œλ₯Ό ν•΄μ„œ κ·Έ νŽ˜μ΄μ§€λ“€μ— λŒ€ν•œ 이후 μ°Έμ‘°λ₯Ό ν•˜λ“œμ›¨μ–΄ λ©”λͺ¨λ¦¬ μ˜€μ—Όμ²˜λŸΌ μ²˜λ¦¬ν•œλ‹€. 이 λ™μž‘μ€ 특ꢌ(CAP_SYS_ADMIN) ν”„λ‘œμ„ΈμŠ€μ—λ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. 이 λ™μž‘μœΌλ‘œ 인해 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ SIGBUSλ₯Ό λ°›κ³  νŽ˜μ΄μ§€ 맡이 제거될 μˆ˜λ„ μžˆλ‹€.

이 κΈ°λŠ₯은 λ©”λͺ¨λ¦¬ 였λ₯˜ 처리 μ½”λ“œ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ 것이닀. 컀널을 CONFIG_MEMORY_FAILURE둜 κ΅¬μ„±ν–ˆμ„ λ•Œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

MADV_MERGEABLE (λ¦¬λˆ…μŠ€ 2.6.32λΆ€ν„°)

addrκ³Ό length둜 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ— 컀널 동일 νŽ˜μ΄μ§€ 병합(KSM: Kernel Samepage Merging) κΈ°λŠ₯을 μΌ λ‹€. 병합 κ°€λŠ₯ν•˜λ‹€κ³  ν‘œμ‹œλœ μ‚¬μš©μž λ©”λͺ¨λ¦¬ μ˜μ—­λ“€μ„ 컀널이 μ •κΈ°μ μœΌλ‘œ μ‘°μ‚¬ν•΄μ„œ λ‚΄μš©μ΄ λ™μΌν•œ νŽ˜μ΄μ§€λ“€μ„ μ°ΎλŠ”λ‹€. 그리고 κ·Έ νŽ˜μ΄μ§€λ“€μ„ μ“°κΈ° λ°©μ§€ νŽ˜μ΄μ§€ ν•œ 개둜 κ΅μ²΄ν•œλ‹€. (이후 ν”„λ‘œμ„ΈμŠ€μ—μ„œ νŽ˜μ΄μ§€ λ‚΄μš©μ„ κ°±μ‹ ν•˜λ € ν•˜λ©΄ νŽ˜μ΄μ§€κ°€ μžλ™μœΌλ‘œ λ³΅μ‚¬λœλ‹€.) KSM은 λΉ„κ³΅μœ  읡λͺ… νŽ˜μ΄μ§€(mmap(2) μ°Έκ³ )만 λ³‘ν•©ν•œλ‹€.

KSM κΈ°λŠ₯은 같은 λ°μ΄ν„°μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 개 μƒμ„±ν•˜λŠ” μ‘μš©λ“€(κ°€λ Ή KVM 같은 가상화 μ‹œμŠ€ν…œ)을 μœ„ν•œ 것이닀. ν”„λ‘œμ„Έμ‹± λŠ₯λ ₯을 많이 μ†Œλͺ¨ν•  수 μžˆμœΌλ―€λ‘œ μ‘°μ‹¬ν•΄μ„œ 써야 ν•œλ‹€. 더 μžμ„Έν•œ λ‚΄μš©μ€ 컀널 μ†ŒμŠ€ 파일 Documentation/admin-guide/mm/ksm.rstλ₯Ό 보라.

MADV_MERGEABLE 및 MADV_UNMERGEABLE λ™μž‘μ€ 컀널을 CONFIG_KSM으둜 κ΅¬μ„±ν–ˆμ„ λ•Œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

MADV_UNMERGEABLE (λ¦¬λˆ…μŠ€ 2.6.32λΆ€ν„°)
μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ—μ„œ μ•žμ„  MADV_MERGEABLE λ™μž‘μ˜ 효과λ₯Ό λ˜λŒλ¦°λ‹€. addrκ³Ό length둜 μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ—μ„œ KSM으둜 λ³‘ν•©ν–ˆλ˜ νŽ˜μ΄μ§€κ°€ 있으면 λ‹€μ‹œ λΆ„λ¦¬ν•œλ‹€.
MADV_SOFT_OFFLINE (λ¦¬λˆ…μŠ€ 2.6.33λΆ€ν„°)

addrκ³Ό length둜 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ„ μ—°μ„± μ˜€ν”„λΌμΈ μ²˜λ¦¬ν•œλ‹€. μ§€μ •ν•œ λ²”μœ„μ˜ 각 νŽ˜μ΄μ§€μ˜ λ©”λͺ¨λ¦¬κ°€ κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€. (즉, λ‹€μŒ μ ‘κ·Ό λ•Œ 같은 λ‚΄μš©μ΄ 보인닀. ν•˜μ§€λ§Œ μƒˆ 물리적 νŽ˜μ΄μ§€ ν”„λ ˆμž„μ— μžˆλŠ” 것이닀.) 그리고 μ›λž˜ νŽ˜μ΄μ§€λŠ” μ˜€ν”„λΌμΈμ΄ λœλ‹€. (즉, λ”λŠ” μ•ˆ 쓰이고 톡상적인 λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ—μ„œ λΉ μ§„λ‹€.) MADV_SOFT_OFFLINE λ™μž‘μ˜ νš¨κ³ΌλŠ” 호좜 ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 보이지 μ•ŠλŠ”λ‹€. (즉, 호좜 ν”„λ‘œμ„ΈμŠ€μ˜ λ™μž‘μ΄ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.)

이 κΈ°λŠ₯은 λ©”λͺ¨λ¦¬ 였λ₯˜ 처리 μ½”λ“œ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ 것이닀. 컀널을 CONFIG_MEMORY_FAILURE둜 κ΅¬μ„±ν–ˆμ„ λ•Œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

MADV_HUGEPAGE (λ¦¬λˆ…μŠ€ 2.6.38λΆ€ν„°)

addrκ³Ό length둜 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ— μžλ™ κ±°λŒ€ νŽ˜μ΄μ§€(THP: Transparent Huge Pages) κΈ°λŠ₯을 μΌ λ‹€. ν˜„μž¬ μžλ™ κ±°λŒ€ νŽ˜μ΄μ§€ κΈ°λŠ₯은 λΉ„κ³΅μœ  읡λͺ… νŽ˜μ΄μ§€(mmap(2) μ°Έκ³ )둜만 λ™μž‘ν•œλ‹€. κ±°λŒ€ νŽ˜μ΄μ§€ ν›„λ³΄λ‘œ ν‘œμ‹œλœ μ˜μ—­λ“€μ„ 컀널이 μ •κΈ°μ μœΌλ‘œ μ‘°μ‚¬ν•΄μ„œ κ±°λŒ€ νŽ˜μ΄μ§€λ‘œ κ΅μ²΄ν•œλ‹€. λ˜ν•œ μ»€λ„μ—μ„œ ν• λ‹Ήν•˜λŠ” μ˜μ—­μ΄ κ±°λŒ€ νŽ˜μ΄μ§€ 크기에 μžμ—°μŠ€λŸ½κ²Œ μ •λ ¬λ˜μ–΄ 있으면 (posix_memalign(3) μ°Έκ³ ) λ°”λ‘œ κ±°λŒ€ νŽ˜μ΄μ§€λ₯Ό ν• λ‹Ήν•˜κ²Œ λœλ‹€.

이 κΈ°λŠ₯이 주둜 λ…Έλ¦¬λŠ” 것은 큰 데이터 맀핑을 μ‚¬μš©ν•˜κ³  κ·Έ λ©”λͺ¨λ¦¬μ˜ 큰 μ˜μ—­λ“€μ— μΌμ‹œμ— μ ‘κ·Όν•˜λŠ” μ‘μš©λ“€(κ°€λ Ή QEMU 같은 가상화 μ‹œμŠ€ν…œ)이닀. 이 κΈ°λŠ₯은 λ©”λͺ¨λ¦¬λ₯Ό λ‚­λΉ„ν•˜κΈ°κ°€ μ•„μ£Ό 쉽닀. (κ°€λ Ή 2MB짜리 λ§€ν•‘μ—μ„œ ν•œ λ°”μ΄νŠΈλ§Œ μ ‘κ·Όν•˜λŠ” 경우 4KB짜리 νŽ˜μ΄μ§€ ν•˜λ‚˜κ°€ μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ 2MBκ°€ μ—°κ²°λœλ‹€.) 더 μžμ„Έν•œ λ‚΄μš©μ€ λ¦¬λˆ…μŠ€ 컀널 μ†ŒμŠ€ 파일 Documentation/admin-guide/mm/transhuge.rstλ₯Ό 보라.

MADV_HUGEPAGE 및 MADV_NOHUGEPAGE λ™μž‘μ€ 컀널을 CONFIG_TRANSPARENT_HUGEPAGE둜 κ΅¬μ„±ν–ˆμ„ λ•Œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

MADV_NOHUGEPAGE (λ¦¬λˆ…μŠ€ 2.6.38λΆ€ν„°)
addrκ³Ό length둜 μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ˜ λ©”λͺ¨λ¦¬κ°€ κ±°λŒ€ νŽ˜μ΄μ§€λ‘œ λ­‰μΉ˜μ§€ μ•Šκ²Œ ν•œλ‹€.
MADV_DONTDUMP (λ¦¬λˆ…μŠ€ 3.4λΆ€ν„°)
addrκ³Ό length둜 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ„ μ½”μ–΄ λ€ν”„μ—μ„œ μ œμ™Έν•œλ‹€. μ½”μ–΄ λ€ν”„μ—μ„œ μ“Έλͺ¨κ°€ μ—†λŠ” μ»€λ‹€λž€ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ°€μ§„ μ‘μš©μ— μœ μš©ν•˜λ‹€. MADV_DONTDUMP의 νš¨κ³Όκ°€ /proc/[pid]/coredump_filter 파일(core(5) μ°Έκ³ )둜 μ„€μ •ν•œ λΉ„νŠΈ λ§ˆμŠ€ν¬λ³΄λ‹€ μš°μ„ ν•œλ‹€.
MADV_DODUMP (λ¦¬λˆ…μŠ€ 3.4λΆ€ν„°)
μ•žμ„  MADV_DONTDUMP의 효과λ₯Ό λ˜λŒλ¦°λ‹€.
MADV_FREE (λ¦¬λˆ…μŠ€ 4.5λΆ€ν„°)

addrκ³Ό length둜 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ“€μ„ μ‘μš©μ—μ„œ λ”λŠ” ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ μ»€λ„μ—μ„œ κ·Έ νŽ˜μ΄μ§€λ“€μ„ ν•΄μ œν•  수 μžˆλŠ”λ°, λ©”λͺ¨λ¦¬ 압박이 μžˆμ„ λ•ŒκΉŒμ§€ ν•΄μ œκ°€ λ―Έλ€„μ§ˆ μˆ˜λ„ μžˆλ‹€. 그리고 ν•΄μ œν•˜κ²Œ ν‘œμ‹œκ°€ λ˜μ—ˆμ§€λ§Œ 아직 ν•΄μ œλ˜μ§€ μ•Šμ€ νŽ˜μ΄μ§€μ— ν˜ΈμΆœμžκ°€ μ“°κΈ°λ₯Ό ν•˜λ©΄ ν•΄μ œ λ™μž‘μ΄ μ·¨μ†Œλœλ‹€. MADV_FREE λ™μž‘ 성곡 후에 μ»€λ„μ—μ„œ νŽ˜μ΄μ§€λ₯Ό ν•΄μ œν•  λ•Œ μ΅œμ‹ μ΄ μ•„λ‹Œ 데이터(즉 λ”λŸ¬μ›Œμ‘Œκ³  기둝 μ•ˆ 된 νŽ˜μ΄μ§€)κ°€ 있으면 κ·Έλƒ₯ μ‚¬λΌμ§€κ²Œ λœλ‹€. ν•˜μ§€λ§Œ 뒀이어 κ·Έ λ²”μœ„μ˜ νŽ˜μ΄μ§€μ—μ„œ 쓰기에 μ„±κ³΅ν•˜κ³  λ‚˜λ©΄ 컀널이 κ·Έ λ”λŸ¬μ›Œμ§„ νŽ˜μ΄μ§€λ₯Ό ν•΄μ œν•  수 μ—†κ³ , κ·Έλž˜μ„œ ν˜ΈμΆœμžλŠ” μ–Έμ œλ‚˜ 방금 κΈ°λ‘ν•œ 데이터λ₯Ό λ³Ό 수 μžˆλ‹€. μ΄μ–΄μ§€λŠ” μ“°κΈ°κ°€ μ—†μœΌλ©΄ μ»€λ„μ—μ„œ κ·Έ νŽ˜μ΄μ§€λ₯Ό μ–΄λŠ λ•Œλ“  ν•΄μ œν•  수 μžˆλ‹€. κ·Έ λ²”μœ„μ˜ νŽ˜μ΄μ§€κ°€ ν•΄μ œλ˜κ³  λ‚˜λ©΄ ν˜ΈμΆœμžλŠ” μ΄μ–΄μ§€λŠ” νŽ˜μ΄μ§€ μ°Έμ‘°μ—μ„œ zero-fill-on-demand νŽ˜μ΄μ§€λ₯Ό 보게 λœλ‹€.

MADV_FREE λ™μž‘μ€ λΉ„κ³΅μœ  읡λͺ… νŽ˜μ΄μ§€(mmap(2) μ°Έκ³ )μ—λ§Œ μ μš©ν•  수 μžˆλ‹€. λ¦¬λˆ…μŠ€ 4.12 전에선 μŠ€μ™‘μ΄ μ—†λŠ” μ‹œμŠ€ν…œμ—μ„œ νŽ˜μ΄μ§€λ₯Ό ν•΄μ œν•  λ•ŒλŠ” λ©”λͺ¨λ¦¬ μ••λ°•κ³Ό 상관없이 μ§€μ •ν•œ λ²”μœ„μ˜ νŽ˜μ΄μ§€λ₯Ό μ¦‰μ‹œ ν•΄μ œν•œλ‹€.

MADV_WIPEONFORK (λ¦¬λˆ…μŠ€ 4.14λΆ€ν„°)

fork(2) ν›„ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 이 λ²”μœ„μ— 0으둜 μ±„μš΄ λ©”λͺ¨λ¦¬λ₯Ό μ€€λ‹€. μ„œλ²„μ—μ„œ λΆ„κΈ°ν•˜λ©΄μ„œ λ―Όκ°ν•œ ν”„λ‘œμ„ΈμŠ€λ³„ 데이터(κ°€λ Ή PRNG μ‹œλ“œ, μ•”ν˜Έν•™μ  λΉ„λ°€κ°’ λ“±)κ°€ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μ „λ‹¬λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 데 μœ μš©ν•˜λ‹€.

MADV_WIPEONFORK λ™μž‘μ€ λΉ„κ³΅μœ  읡λͺ… νŽ˜μ΄μ§€(mmap(2) μ°Έκ³ )μ—λ§Œ μ μš©ν•  수 μžˆλ‹€.

fork(2)둜 μƒμ„±ν•œ μžμ‹μ—μ„œ μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ— MADV_WIPEONFORK 섀정이 κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€. execve(2) κ³Όμ •μ—μ„œλŠ” 이 섀정이 사라진닀.

MADV_KEEPONFORK (λ¦¬λˆ…μŠ€ 4.14λΆ€ν„°)
μ•žμ„  MADV_WIPEONFORK의 효과λ₯Ό λ˜λŒλ¦°λ‹€.

RETURN VALUE

성곡 μ‹œ madvise()λŠ” 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

EACCES
adviceκ°€ MADV_REMOVE인데 μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„κ°€ μ“°κΈ° κ°€λŠ₯ν•œ 곡유 맀핑이 μ•„λ‹ˆλ‹€.
EAGAIN
컀널 μžμ›μ΄ μΌμ‹œμ μœΌλ‘œ λΆ€μ‘±ν•˜λ‹€.
EBADF
맡이 μ‘΄μž¬ν•˜μ§€λ§Œ κ·Έ μ˜μ—­μ— 파일 μ•„λ‹Œ λ­”κ°€κ°€ λ§΅ λ˜μ–΄ μžˆλ‹€.
EINVAL
addr이 νŽ˜μ΄μ§€μ— μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šκ±°λ‚˜ lengthκ°€ μŒμˆ˜μ΄λ‹€.
EINVAL
adviceκ°€ μœ νš¨ν•˜μ§€ μ•Šλ‹€.
EINVAL
adviceκ°€ MADV_DONTNEEDλ‚˜ MADV_REMOVE인데 μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ— κ³ μ •λœ νŽ˜μ΄μ§€λ‚˜ κ±°λŒ€ TLB νŽ˜μ΄μ§€, VM_PFNMAP νŽ˜μ΄μ§€κ°€ 포함돼 μžˆλ‹€.
EINVAL
adviceκ°€ MADV_MERGEABLEμ΄λ‚˜ MADV_UNMERGEABLE인데 컀널을 CONFIG_KSM으둜 κ΅¬μ„±ν•˜μ§€ μ•Šμ•˜λ‹€.
EINVAL
adviceκ°€ MADV_FREEλ‚˜ MADV_WIPEONFORK인데 μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ— νŒŒμΌμ΄λ‚˜ κ±°λŒ€ TLB, MAP_SHARED, VM_PFNMAP λ²”μœ„κ°€ 포함돼 μžˆλ‹€.
EIO
(MADV_WILLNEEDμ—μ„œ) 이 μ˜μ—­μ˜ νŽ˜μ΄μ§€λ“€μ„ 듀이면 ν”„λ‘œμ„ΈμŠ€ μ΅œλŒ€ 상주 μ§‘ν•© 크기λ₯Ό μ΄ˆκ³Όν•˜κ²Œ λœλ‹€.
ENOMEM
(MADV_WILLNEEDμ—μ„œ) λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•΄μ„œ νŽ˜μ΄μ§€λ₯Ό λ“€μ΄λŠ” 데 μ‹€νŒ¨ν–ˆλ‹€.
ENOMEM
μ§€μ •ν•œ λ²”μœ„μ˜ μ£Όμ†Œκ°€ ν˜„μž¬ λ§΅ λ˜μ–΄ μžˆμ§€ μ•Šκ±°λ‚˜ ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간 밖에 μžˆλ‹€.
EPERM
adviceκ°€ MADV_HWPOISON인데 ν˜ΈμΆœμžκ°€ CAP_SYS_ADMIN μ—­λŠ₯을 κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.

VERSIONS

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

CONFORMING TO

madvise()λŠ” μ–΄λŠ ν‘œμ€€μ—λ„ λͺ…μ„Έλ˜μ–΄ μžˆμ§€ μ•Šλ‹€. λ‹€μ–‘ν•œ advice 값듀을 κ΅¬ν˜„ν•œ 이 μ‹œμŠ€ν…œ 호좜의 μ—¬λŸ¬ 버전이 λ‹€λ₯Έ μ—¬λŸ¬ κ΅¬ν˜„λ“€μ— μ‘΄μž¬ν•œλ‹€. 보톡 λ‹€λ₯Έ κ΅¬ν˜„λ“€μ—μ„œλŠ” 적어도 전톡적인 μ‘°μ–Έ 값에 λ‚˜μ—΄λœ ν”Œλž˜κ·Έλ“€μ„ κ΅¬ν˜„ν•˜κ³  μžˆμ§€λ§Œ μ˜λ―Έμ— μ•½κ°„μ˜ 차이가 μžˆλ‹€.

POSIX.1-2001에 κΈ°μˆ ν•˜λŠ” posix_madvise(3)μ—λŠ” μƒμˆ˜ POSIX_MADV_NORMAL, POSIX_MADV_RANDOM, POSIX_MADV_SEQUENTIAL, POSIX_MADV_WILLNEED, POSIX_MADV_DONTNEED 등이 μžˆλŠ”λ° μœ„μ— λ‚˜μ—΄λœ λΉ„μŠ·ν•œ μ΄λ¦„μ˜ ν”Œλž˜κ·Έλ“€κ³Ό λ™μž‘ 방식이 λΉ„μŠ·ν•˜λ‹€.

NOTES

λ¦¬λˆ…μŠ€ μ°Έκ³  사항

λ¦¬λˆ…μŠ€ κ΅¬ν˜„μ—μ„œλŠ” μ£Όμ†Œ addr이 νŽ˜μ΄μ§€μ— μ •λ ¬λ˜μ–΄ 있기λ₯Ό μš”κ΅¬ν•˜λ©° lengthκ°€ 0인 것을 ν—ˆμš©ν•œλ‹€. μ§€μ •ν•œ μ£Όμ†Œ λ²”μœ„μ˜ 일뢀가 λ§΅ λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우 λ¦¬λˆ…μŠ€ 버전 madvise()λŠ” κ·Έ 뢀뢄을 λ¬΄μ‹œν•˜κ³  λ‚˜λ¨Έμ§€μ— 호좜 λ‚΄μš©μ„ μ μš©ν•œλ‹€. (ν•˜μ§€λ§Œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ μ›λž˜ κ·Έλž˜μ•Ό ν•˜λŠ” λŒ€λ‘œ ENOMEM을 λ°˜ν™˜ν•œλ‹€.)

SEE ALSO

getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2), prctl(2), posix_madvise(3), core(5)


2019-03-06

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