문제

파일을 메모리에 매핑하면 시스템 호출이 필요합니다. 파일에 대한 후속 액세스에 시스템 호출이 필요하거나 프로세스의 가상 메모리 페이지가 메모리의 실제 페이지 캐시에 매핑되어 있습니까?

업데이트: 내가 알고 싶은 것은 여러 프로세스가 MMAP를 통해 동일한 파일에 액세스하는 경우입니다. 그들은 동일한 물리적 메모리 부분 쓰기에 액세스 할 것입니다.

도움이 되었습니까?

해결책

추가 시스템 호출이 필요하지 않습니다 (당신의 과정에 의해), 당신은 단지 일반 메모리처럼 액세스합니다. 파일이 완료되면 전화하십시오 munmap.

반환 값

성공에 mmap()매핑 된 영역에 대한 포인터를 반환합니다. 오류에서는 값입니다 MAP_FAILED (즉, (void *) -1)이 반환되고 Errno는 적절하게 설정됩니다. 성공에 munmap() 실패 -1에서 0을 반환합니다 errno 설정되었습니다 (아마도 EINVAL).

자세한 내용은 여기 Man Page를 참조하십시오.

설명 편집 :

기능이 파일을 호출 프로세스의 메모리 공간에 매핑하고 메모리 블록의 시작 부분에 대한 포인터를 반환한다고 말합니다.

예를 들어, 두 개의 다른 프로세스가있는 경우 동일한 파일을 MAP_SHARED 플래그는 각 프로세스가 동일한 물리적 메모리에 액세스 할 수 있지만 해당 메모리는 각 프로세스의 가상 메모리 공간에서 다른 위치에 매핑 될 수 있습니다. 즉, 각 프로세스의 가상 메모리 공간에서 MMAP에 의해 리턴 된 포인터는 동일하지 않을 수 있습니다.

이것은 예를 들어 공유 메모리 블록 안에 포인터를 저장 해야하는 경우 해당 포인터가 블록 / 파일의 시작과 관련하여 오프셋으로 저장된 경우에만 유용하며 유용하게 가리킬 수 있다는 점을 제기합니다. 블록 / 파일 내부 위치.

다른 팁

파일을 MMAP에 있으면 Linux는 MMU (메모리 관리 장치)에서 항목을 만듭니다. MMU는 CPU의 모든 읽기와 글을 실제 RAM에보고합니다. 이렇게하면 메모리의 일부에 액세스 할 때 mmap() 반환. 아직 실제 RAM에없는 부분을 읽으면 페이지 결함이 발생합니다. MMU는 파일의 오른쪽 부분을 RAM에로드하기 위해 커널 루틴을 호출하고 MMU 테이블의 항목을 업데이트하여 데이터가 이제 주소에 위치한 것으로 보입니다. mmap() 너에게 줬다. 실제로, 그것은 다른 곳에있을 것이지만 MMU는 이것을 완전히 투명하게 만들 것입니다.

메모리에 쓰면 MMU는 수정 된 페이지를 "더러운"것으로 표시합니다. 그들이 플러시 될 때 (파일의 더 많은 액세스 또는 전화하기 때문에 munmap()), 그러면 변경 사항이 디스크에 기록됩니다.

따라서 페이지 결함과 더러운 페이지가 플러시 될 때마다 시스템 호출이 발생합니다. 그러나 페이지는 4 또는 8KB이므로 거의 발생하지 않습니다. 또한 커널은 한 번에 단일 페이지 이상을로드하므로 시스템 호출 수가 다시 줄어 듭니다. 마지막으로 동일한 코드가 스와핑을 구현하는 데 사용되므로 매우 최적화됩니다.

이 모든 효과는 MMAP를 매우 효율적으로 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top