나는 다음과 같은 문제가`와 대용량 메모리 매핑 : 제로 madvise`
내가MAP_ANONYMOUS
와
mmap
를 통해 메모리 (여러 GIB)의 큰 덩어리를 할당합니다. 그 덩어리는 매번 제로가 될 필요가있는 큰 해시 맵을 가지고 있습니다. 각 라운드에서 전체 맵핑을 사용할 수있는 것은 아닙니다 (모든 페이지에 오류가있는 것은 아님).
memset
은 그리 좋은 생각이 아닙니다. 너무 오래 걸립니다.
신속하게 처리하는 가장 좋은 전략은 무엇입니까?
후속 액세스가 새 빈 페이지를 제공하는 윌
madvise(ptr, length, MADV_DONTNEED);
보증 나? 리눅스 man madvise
페이지에서
(MADV_DONTNEED의 경우를 제외하고) 응용 프로그램의 의미에 영향을 미치지 않습니다,하지만 성능에 영향을 미칠 수있는이 호출. 커널은 조언을 무시해도 무방합니다.
...
MADV_DONTNEED
이후의 성공이 범위의 페이지 액세스,하지만 기본 매핑 파일에서 메모리 내용의 다시로드에 하나 발생합니다 (적 mmap (2) 참조) 기본 파일이없는 매핑의 경우 주문형 페이지가 필요 없습니다. 현재 리눅스 구현 (2.4.0)의 조언으로보다 명령으로 더이 시스템 호출을 볼
...
또는 내가 munmap
에있는이 지역을 매핑 할 다시 한번?
그것은 리눅스에서 작동 이상적으로 OS X의
이 테스트 방법은 없지만 FWIW [OSX] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/madvise.2. html) 맨 페이지는 'madvise'd 페이지가 0 인 것에 대해 언급하지 않습니다. [posix] (http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_madvise.html) 버전도 아닙니다. 메모리 공간을 다시 mmapping하는 오버 헤드가 큰가요? – Collin
@Collin 지나치게 큰 성능은 아니지만 스레드를 일시 중단하고 필요한 경우 포인터를 새 매핑으로 업데이트해야합니다. 그게 잘못 될 수있는 더 많은 병렬 코드입니다 ... 그리고 저는이 호출이 실제로 어떻게 작동하는지 궁금합니다. –