참고

https://jaenam615.github.io/posts/mmap_munmap/

mmap() - memory mapping

파일 처리 성능 개선 기법 - 메모리에 파일을 매핑하기

- 프로세스에서 파일을 읽을 때, OS의 시스템 콜을 시작으로 저장매체에 접근하여 파일을 읽기
	까지의 과정이 복잡하며 오래걸림

- 더불어, 내부적으로 OS가 처리해야하는 과정(시스템 콜, 인터럽트, 스케줄링)이 많기 떄문에 
	CPU 성능이 떨어지기 마련

- 이처럼 파일에 접근하는 과정의 효율성을 높이기 위해 사용하는 함수가 mmap()

mmap()의 동작방식

- mmap()은 메모리의 특정 공간에 파일을 매핑

- 프로세스는 해당 파일을 읽기 위해서 저장매체에 접근하는 것이 아닌, 메모리의 데이터에
	접근하는 방식

- 그러므로 시스템 콜, 스케줄링, 인터럽트 등 OS의 개입과 저장매체로의 접근이 필요없음

mmap()의 인자

[ 함수 ]
#include <sys/mman.h>
void  *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
[ addr ]
- 매핑할 메모리 주소를 지정
- 보통 NULL을 넣어서 OS가 알아서 적절한 주소를 잡게 함

[ fd ]
- 매핑할 대상 파일의 file descriptor
- open()으로 열어서 받은 값을 넣음

[ offset ]
- 파일의 몇 번째 바이트부터 가져올지
- 예를 들어 offset=1000이면 파일의 1000번째 바이트부터 읽기 시작
- 페이지 크기(보통 4KB)의 배수여야 함

[ length ]
- offset 지점부터 얼만큼 매핑할지(바이트 단위)

[ prot ]
- 매핑된 메모리의 접근 권한
	- PROT_READ : 읽기
	- PROT_WRITE : 쓰기
	- PROT_EXEC : 실행
	- PROT_NONE : 접근 불가

[ flags ]
- 매핑 방식
	- MAP_SHARED : 변경 사항이 원본 파일에 반영되고, 다른 프로세스와 공유됨
	- MAP_PRIVATE : COW방식, 변경해도 원본 파일에 영향 없음

장단점

[ 장점 ]
- read와 write를 반복적으로 실행하는 경우, 파일 접근(저장매체 접근)을 방지하여 속도 및
	성능 개선을 함

- 파일에 직접적으로 접근하는 경우, lseek()라는 함수를 사용하여 해당 파일의 데이터 주소를
	검색

- 이 과정에서 물리적인 시간이 오래걸리는데, 이를 사용하지 않고 메모리를 통해
	포인터 조작만으로 파일 탐색이 가능
[ 단점 ]
- mmap()은 가상메모리를 적극적으로 활용하는 함수

- 만약 가상메모리에서 페이징 시스템을 사용한다면, 각 페이지는 고정된 사이즈의 블록을 사용

- 4KB 단위의 페이지를 사용하는 페이징 시스템이라면, 1 Byte 파일을 매핑하기 위해서 한개의
	페이지를 사용하게 됨.

munmap() - 파일이 매핑된 메모리 해제

[ 설명 ]
- mummap() 함수는 mmap()으로 파일이 매핑된 메모리 공간을 강제로 해제하는 함수
[ 함수 ]
int munmap(void *addr, size_t length);
// *addr: mapping된 물리 메모리의 시작주소 
// length: mapping된 물리 메모리의 길이(mmap에서 지정했던 길이와 동일)
출처: <https://devraphy.tistory.com/428> [개발자를 향하여:티스토리]