mmap()에 대한 연구를 통해 mmap은 페이지 오류로 인해 가상 메모리 주소에 도달한 경우에만 요청 페이징을 사용하여 데이터를 커널 페이지 캐시에 복사한다는 것을 알고 있습니다.
페이지 캐시보다 큰 파일을 읽는 경우 페이지 캐시의 일부 오래된 페이지를 재활용을 위해 교체 해야 합니다 . 그래서 제 질문은 페이지 테이블이 업데이트되어 해당 가상 메모리 주소를 캐시의 오래된 오래된 페이지(이제 새 데이터가 포함되어 있음) 주소에 매핑됩니까?입니다. 어떻게 이런일이 일어 났습니까? 이것이 mmap() 시스템 호출의 일부입니까?
답변1
해당 가상 메모리 주소를 캐시의 이전 오래된 페이지(현재 새 데이터 포함) 주소에 매핑하도록 페이지 테이블이 업데이트됩니까? 어떻게 이런일이 일어 났습니까?
호출되면 mmap()
프로세스의 가상 주소 공간에 지정된 파일에 대한 매핑을 만듭니다. 이 매핑은 실제로 액세스할 때 이러한 페이지를 로드하는 기능만 설정하며 아직 메모리에 아무것도 로드하지 않습니다. 이러한 페이지에 액세스하면 페이지 폴트가 생성되고 페이지 테이블 항목이 업데이트되어 가상 주소를 새로 로드된 페이지의 물리적 주소에 매핑한 다음 파일에 액세스할 수 있습니다. 이것은 에서 일어났습니다 filemap_fault
.
이는 제거된 매핑된 페이지에 액세스하는 경우에도 작동하는 방식입니다. 커널은 페이지 오류를 처리하고 파일 내용을 다시 페이지에 넣지만 애플리케이션의 관점에서는 아무 일도 일어나지 않습니다.
여기에는 그 자체로는 특별한 것이 없습니다 mmap()
. 이는 수요 페이징이 Linux 커널에서 일반적으로 작동하는 방식이며 거의 모든 것, 심지어 일반 프로그램 메모리 및 파일 캐시 항목에도 사용됩니다.
[...] 해당 가상 메모리 주소 매핑 [...]
reads 를 사용할 때 mmap()
커널은 일반적으로 MADV_RANDOM
(사용자가 표시한) 또는 MMAP_LOTSAMISS
(커널 에서 표시한) 도움이 되지 않는다는 표시가 없는 한 페이지 오류를 생성한 단일 페이지보다 더 많은 콘텐츠를 로드하기 위해 미리 읽기를 사용합니다. 휴리스틱).