- 운영체제에서 파일을 다루는 방법 중 하나
- 프로세스의 가상 메모리 주소 공간에 파일을 매핑한 뒤 가상 메모리 주소에 직접 접근하는 것으로 파일 읽기/쓰기를 대신한다.
- 기본 파일 입출력 API에 비해 저렴한 비용을 사용하여 파일의 내용에 접근이 가능
- 다른 프로세스에서 동일한 파일에 메모리 맵 파일을 이용하여 접근할 경우 '공유메모리' 처럼 사용 가능
- 중복된 내용 만큼의 메모리 절약
- 하나의 프로세스가 동시에 여러 번 동작할 때 실행코드와 같은 읽기 전용 세그먼트를 공유할 수 있음
📘 장점
- 직접적인 파일 입출력을 수행할 필요 없음
- 메모리 맵 파일을 사용하면 파일 내용이 메모리 주소에 올라가게됨으로써 파일을 모두 불러온 것 처럼 메모리 주소를 이용하여 연산 작업 가능
- 버퍼나 파일 처리를 위한 추가적인 자료 구조가 필요 없음
- 운영체제에서 페이징 기법을 사용하여 파일의 내용을 관리하고, 페이지 크기에 따라 적절히 파일의 내용을 읽고 쓸 수 있음
- 대용량의 자료를 처리할 때에 효율적
- 파일에 접근 할 때에 지연 적재를 이용하므로 필요한 부분만 파일에서 불러와 작업이 가능
- 전통적인 파일 입출력 API를 통한 파일 처리보다 빠름
- 4kiB 단위로 자료를 미리 불러 올 때 발생하는 페이지 부재외의 모든 작업이 실제 메모리상에서 이루어지므로 파일 처리가 빠름
📕 단점
- 대용량 파일을 매핑할 때 외부 단편화가 있을 경우 여러움
- mmap은 가상 주소 공간의 연속된 페이지들에 파일을 올리는 시스템 콜입니다. 만약 가상 주소 공간에 외부 단편화가 존재할 경우 파일을 작은 크기로 잘라주어 매핑 해주어야 함
- 너무 작은 파일을 읽어올때 좋지 않음
- 페이지 폴트가 났을 때만 파일에서 메모리로 읽어오기 때문에 페이지 폴트에 사용되는 비용을 낭비하지 않으려면 충분한 크기의 파일을 읽어 올 때 사용하는 것이 좋음
- 파일의 offset도 페이지 정렬이 되어 있어야함
- 만약 페이지 크기의 배수가 아닌 파일 오프셋에서 데이터를 읽어 오려고하면 읽어 오는 위치를 페이지 크기의 배수가 되도록 정렬 필요
👉 do_mmap
👉 load_segment
👉 do_munmap 함수