mmap 문서를 보고 있어요여기그리고 그것을 사용하여 그것을 달성하려고이 비디오.
구현에 몇 가지 문제가 있습니다.
mmap은 파일 매핑을 제공하고 실제 메모리의 해당 위치에 대한 포인터를 반환합니까, 아니면 매핑 테이블의 주소를 반환합니까? 파일 공간도 할당하고 잠그나요?
파일이 메모리의 해당 위치에 저장되면 munmap이 호출될 때까지 그대로 유지됩니까?
파일이 메모리로 이동되었습니까? 아니면 단지 리디렉션으로 사용되는 매핑 테이블이고 파일이 실제로 가상 메모리(디스크)에 있습니까?
메모리로 이동한다고 가정하면 다른 프로세스가 해당 주소를 가지고 있으면 해당 공간에 액세스하여 데이터를 읽을 수 있습니까?
답변1
질문에 순서대로 대답하세요.
- 위치에 대한 포인터를 반환합니다.가상가상 메모리 주소 공간이 할당되지만 명시적으로 잠그지 않는 한 파일은 어떤 방식으로도 잠기지 않습니다(또한 메모리 잠금은 파일의 영역을 잠그는 것과 같지 않습니다). 페이징 및 가상 메모리로 인해 mmap()의 효율적인 구현은 실제적인 관점에서만 볼 수 있습니다(그렇지 않으면 전체 영역을 메모리로 읽어야 합니다).앞으로통화 완료).
- 정확하지는 않지만 다음 답변과 관련이 있으므로 여기서 다루겠습니다.
- 거의. 대부분의 경우 실제로 일어나는 일은 mmap()이 페이지 캐시에 있는 파일 데이터에 대한 쓰기 중 복사 액세스를 제공한다는 것입니다. 따라서 데이터 수명에 대한 일반적인 캐시 제한이 적용됩니다. 시스템에 공간이 필요한 경우 페이지를 캐시에서 제거할 수 있으며(또는 더러워진 경우 디스크로 플러시) 다시 실패해야 합니다.
- 아니요, 가상 메모리 작동 방식 때문입니다. 각 프로세스에는 자체 가상 주소 공간과 가상 매핑이 있습니다. 데이터 통신을 원하는 모든 프로그램은 동일한 파일(또는 공유 메모리 세그먼트)에서 mmap()을 호출해야 하며 모두 이
MAP_SHARED
플래그를 사용해야 합니다.
mmap()이 파일에만 작동하는 것이 아니라 다음과 같은 다른 작업도 수행할 수 있다는 점은 주목할 가치가 있습니다.