2016-12-09 1 views
0

mmap에 대해 좀 더 잘 이해하려고합니다. 나는 최근 관련 유래 질문이 허용 대답이 부분 (아래 인용)를 읽어 mmap and memory usagemmap()은 특정 오프셋에서 일반 Posix I/O에 비해 정보를 읽는 데 어떤 도움이됩니까

의 당신의 데이터 100MB의 청크를 읽을 수 있다고 가정 해 봅시다, 그리고 헤더 데이터의 초기 1메가바이트, 정보에 따라 그 원하는 오프셋은 75MB이므로 1 ~ 74.9MB 사이의 값은 필요하지 않습니다! 을 읽으면서 코드를 단순하게 만들었습니다. mmap을 사용하면 만 실제로 액세스 한 데이터 (반올림 된 4kb 또는 OS 페이지 크기, 대부분 4kb)를 읽을 수 있으므로 첫 번째와 번째 75 번째 MB를 읽습니다.

mmap의 장점 (컨텍스트 스위치가 필요없고 콘텐츠를 교환 할 필요가 없음)을 이해하지만이 오프셋을 이해하지 못합니다. 우리가 mmap을하지 않고 75 번째 MB 오프셋에서 정보가 필요하다면 mmap을 사용하지 않고 표준 POSIX 파일 I/O 호출로 그렇게 할 수 없습니까? 왜 mmap이 정확히 여기에서 도움이됩니까?

+0

'mmap()'은 과장된 해결책 인 경향이 있습니다. 리누스 토발즈 (Linus Torvalds) 자신이 작성한 [이 게시물 (http://marc.info/?l=linux-kernel&m=95496636207616&w=2)]은 데이터에 대한'mmap()'접근이 3 배나 많은 양의 불편을 겪었습니다 'read()'를 사용하여 간단히 시간을 저장한다. –

답변

0

물론 가능합니다. 언제든지 파일을 열고 필요한 부분 만 읽을 수 있습니다.

mmap()은 코드를 작성하고 싶지 않거나 내용에 스파 스 액세스가 필요하고 캐싱 로직을 많이 작성하지 않으려 고 할 때 편리 할 수 ​​있습니다.

mmap()을 사용하면 파일의 전체 컨테스트를 메모리의 오프셋에 "매핑"합니다. 대부분의 mmap() 구현은 지연 처리를하므로 파일의 각 ~ 4K 블록은 해당 메모리 위치에 액세스 할 때 필요에 따라 읽혀집니다.

거대한 배열 (예 : int* someInt = &map[750000000]; return *someInt;)처럼 파일의 데이터에 액세스하면 파일의 어떤 부분이 읽혔는지, 파일을 읽을 때, 얼마나 더러운 데이터 블록을 다시 파일에 쓰는지, 메모리를 비워 RAM을 비우는지를 결정합니다.

관련 문제