MADVISE(2)

명칭
madvise - 메모리의 사용법에 대해 조언을 준다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/mman.h> int madvise(void *addr, size_t len, int behav)

해설
madvise() 시스템 콜에 의해, 자신의 메모리 이용의 습성의 지식이 있는 프로세스는, 그것을 시스템에 설명할 수 있습니다. 지금까지 알려져 있는 습성은, <sys/mman.h> 그리고 정의되고 있어 다음과 같습니다.

    #define	MADV_NORMAL	0 /* 이 이후, 특수한 처리는 필요없다 */
    #define	MADV_RANDOM	1 /* 랜덤인 페이지 참조가 예측된다 */
    #define	MADV_SEQUENTIAL	2 /* 시퀀셜인 참조가 예측된다 */
    #define	MADV_WILLNEED	3 /* 이러한 페이지를 필요로 한다 */
    #define	MADV_DONTNEED	4 /* 이러한 페이지를 필요로 하지 않는다 */
    #define	MADV_FREE	5 /* 데이터는 지금 중요하지 않다 */
    #define MADV_NOSYNC     6 /* 명시적으로 물리적 배킹 스토어가
    				위탁되지 않는 경우 */
    #define MADV_AUTOSYNC   7 /* 디폴트는 물리적 배킹 스토어에
    				위탁된다 */
    #define MADV_NOCORE     8 /* 코어 파일에 페이지를 포함하지 않는 것 */
    #define MADV_CORE       9 /* 코어 파일에 페이지를 복귀시킨다 */

MADV_NORMAL
    디폴트의 페이징 동작으로 돌아오도록(듯이) 시스템에 지시합니다.

MADV_RANDOM
    페이지가 랜덤에 액세스 되어 프리펫치가 유리하지 않다고 생각된다고 한다 힌트입니다.

MADV_SEQUENTIAL
    지정의 페이지가 fault로 읽혔을 때, 그 페이지의 직전의 페이지의 우선 순위를 VM 시스템이 내리도록(듯이) 합니다.

MADV_WILLNEED
    지정의 가상 주소 범위내에 있는 페이지가 일시적으로 높은 우선 순위를 가지도록(듯이) 해, 그것들이 메모리내에 있는 경우, 해방될 가능성을 감소시킵니다. 한층 더 이미 메모리내에 있는 페이지는 즉시 프로세스에 MAP 되어 거기에 따라 프로세스 전체에 걸치는 fault에 의한 읽기에 의한다 불필요한 오버헤드를 제거합니다. 이것은, fault에 의한 페이지의 배킹 스토어로부터의 읽기를 일으키게 하는 것이 아니라, 메모리내에 이미 있는 페이지를 호출해 옆의 프로세스에 재빠르게 MAP 시킵니다.

MADV_DONTNEED
    VM 시스템에, 지정의 범위내의 페이지의 메모리내 우선 순위의 감소를 허가합니다. 향후, 이 주소 범위에의 참조는 페이지 폴트를 발생시키겠지요.

MADV_FREE
    VM 시스템에 페이지를 해방하는 자유를 주어 지정 페이지 범위내의 정보가 이미 중요하지 않은 것을 시스템에 통지합니다. 이것은, address 공간을 유효하게 한채로 malloc(3) 하지만 address 공간내의 임의의 위치의 페이지를 해방할 수 있도록(듯이) 하는 효율적인 방법입니다. 페이지가 다음에 참조될 때에는, 그 페이지는 요구시 제로 클리어의 대상으로 되어 있을 가능성도 있고, 또는 MADV_FREE 호출 전에 거기에 있던 데이터가 남아 있을지도 모릅니다. 페이지가 다시 수정될 때까지, 그 address 공간 범위에 대한 참조만으로는, VM 시스템은 배킹 스토어로부터 정보를 페이지에 읽어들이는 동작을 실시하지 않게 됩니다.

MADV_NOSYNC
    이 MAP에 관련 지을 수 있고 있는 데이터를 물리적 배킹 스토어에 플래시 하지 않게 시스템에 요구합니다. 통상, 이것에 의해, 파일 시스템 업데이트 demon가 VM 시스템이 더럽힌 페이지를 특히 이유도 없는데 물리 디스크에 쓰기불필요한 동작을 방지합니다. VM 와 파일 시스템의 일관성은 항상 유지되는 것에 주의해 주세요. 이 기능은, MAP 된 데이터가 필요한 때만, (통상, 시스템페이쟈에 의해) 플래시 되는 것을 프로텍션하고 있는에 지나지 않습니다.

    이 기능을 사용하는 전형적인 경우란, 파일을 뒤에 가지는 공유 메모리 area를 프로세스 (IPC) 간 통신으로 사용하고 싶을 때, 특히, 그 area에 격납되는 데이터를 물리적 디스크에 기입할 필요가 없는 경우입니다. 이 기능은, SysV 공유 메모리 호출로 얻을 수 있는 mmap 성능과 동등의 성능을 주고, 한편, SysV 공유 메모리 호출을 사용하는 것보다, 치밀한 제어가 가능해보다 제약이 적은 방법이기도 합니다. 그러나 이 기능은 UNIX 플랫폼간에서 이식성이 없는 것에 주의해 주세요 (몇개의 플랫폼에서는 디폴트로 올바르게 행동할지도 모르지 않습니다만). 자세한 정보에 관해서는, mmap(2) 의 MAP_NOSYNC 섹션을 참조해 주세요.

MADV_AUTOSYNC
    장래, 주소 범위내의 페이지가 더럽혀졌을 경우를 위해서(때문에) MADV_NOSYNC 의 효과를 바탕으로 되돌립니다. 이미 더럽혀지고 있는 페이지에 대한 효과는 부정입니다. 써 되돌려 할지도 모르고, 하지 않을지도 모릅니다. 쓰기 반환을 확실히 행하려면 , msync(2) 또는 fsync(2) 시스템 콜을 사용합니다.

MADV_NOCORE
    area는, 코어 파일에 포함되지 않습니다.

MADV_CORE
    코어 파일의 area를 포함합니다.

반환값

에러
madvise() 함수는 다음의 경우에 실패합니다.

[EINVAL]
    addr 인수와 len 인수로 지정된 가상 주소 범위가 유효하지는 않습니다.

관련 항목
mincore(2), mprotect(2), msync(2), munmap(2)

역사
madvise() 함수는 4.4BSD 그리고 처음 등장했습니다.