이미지 파일이 포함된 대용량 tar 파일(60GB)이 있습니다. 저는 mmap()
이러한 무작위 액세스 이미지를 읽기 위해 전체 파일을 사용하고 있습니다.
내가 그것을 사용하는 이유는 다음과 같습니다 mmap()
.
- 스레드 안전성 - 여러 스레드에서 ifstream을 찾을 수 없습니다.
- 추가 버퍼링을 피할 수 있습니다.
- 일부 캐시(이미 존재하는 요청된 페이지 형식)를 얻습니다.
문제는 60GB 파일의 이미지를 모두 읽은 후에는 어떻게 됩니까? 물론 모든 이미지가 즉시 사용되는 것은 아닙니다. 이미지를 읽고 표시한 다음 삭제합니다.
내 mmap()
전화 번호는:
mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0);
문제는 커널이 내가 매핑한 파일 기반 읽기 전용 페이지를 확인하고 메모리 부족으로 인해 사용되지 않는 페이지를 단순히 지운다는 것입니다.이 사건이 받아들여졌는지는 잘 모르겠습니다. 매뉴얼 페이지에는 MAP_NORESERVE
스왑 공간 지원이 필요하지 않다고 나와 있지만 메모리 부족으로 인해 페이지에 어떤 일이 일어날지 보장할 수 없는 것 같습니다. 파일 시스템 캐시나 이를 OOM하는 다른 프로세스를 지우기 전에 커널이 원치 않는 페이지를 지우는 것이 보장됩니까?
감사해요!
답변1
읽기 전용은 뒤에 오는 및 와 mmap
대체로 동일합니다 . 프로세스에 매핑된 메모리 블록이 파일에 의해 지원되는 경우 RAM의 복사본은 디스크 캐시의 일부로 간주되며 마치 디스크 캐시 항목이 파일에서 생성된 것처럼 메모리 부족으로 인해 해제됩니다.open
lseek
read
read
소스 코드를 확인하지는 않았지만 MAP_NORESERVE
읽기 전용 매핑에는 차이가 없다고 생각합니다.