메모리 매핑 파일
Memory-mapped file메모리 매핑파일은 파일 또는 파일과 유사한 리소스의 일부와 직접 바이트 대 바이트 상관관계가 할당된 가상[1] 메모리의 세그먼트입니다.이 리소스는 일반적으로 디스크에 물리적으로 존재하는 파일이지만 운영 체제가 파일 설명자를 통해 참조할 수 있는 장치, 공유 메모리 개체 또는 기타 리소스일 수도 있습니다.일단 파일과 메모리 공간 간의 상관관계에 의해 어플리케이션은 매핑된 부분을 프라이머리 메모리로 취급할 수 있습니다.
역사
TOPS-20 PMAP
이 [2]기능의 c.초기(1969년) 구현은 DEC-20의 [3]TOPS-20 운영체제에서의 PMAP 시스템 호출이었습니다.이것은 소프트웨어 하우스의 System-1022 데이터베이스 [4]시스템에서 사용되는 기능입니다.
SunOS 4 mmap
SunOS[5] 4는 Unix의mmap
이를 통해 프로그램이 [1]"메모리에 파일을 매핑"할 수 있게 되었습니다.
윈도 확장 가능 메모리 맵 파일(GMMF)
TOPS-20의 PMAP가 출시된 지 20년이 지난 후, Windows NT는 Growable Memory-Mapped Files(GMMF)를 받았습니다.
"이래"CreateFileMapping
이 함수는 크기를 전달해야 하며, 파일 크기를 변경하는 것은 쉽지 않습니다."라는 GMMF API가 [6]개발되었습니다.GMMF를 사용하려면 파일 크기를 늘릴 수 있는 최대값을 선언해야 하지만 사용되지 않는 공간은 낭비되지 않습니다.
혜택들
메모리 매핑의 장점은 특히 대용량 파일에서 사용할 경우 I/O 성능이 향상된다는 것입니다.작은 파일의 경우 메모리 맵은 항상 페이지 크기(대부분 4KiB)에 맞춰져 있기 때문에 메모리 매핑된 파일은 여유[7] 공간을 낭비할 수 있습니다.따라서 5KiB 파일은 8KiB를 할당하므로 3KiB가 낭비됩니다.메모리 매핑파일에의 액세스는, 직접적인 읽기 및 쓰기 조작을 사용하는 것보다, 2개의 이유로 고속입니다.첫째, 시스템 호출은 프로그램의 로컬 메모리에 대한 단순한 변경보다 훨씬 느린 속도입니다.둘째, 대부분의 운영 체제에서 실제로 매핑된 메모리 영역은 커널의 페이지 캐시(파일 캐시)입니다. 즉, 사용자 공간에 복사본을 만들 필요가 없습니다.
특정 응용 프로그램 수준의 메모리 매핑 파일 작업도 물리적 파일 작업보다 성능이 우수합니다.파일 시작부터 검색하거나 편집한 내용 전체를 임시 위치에 다시 쓰는 것이 아니라, 애플리케이션은 파일 내의 데이터에 직접 액세스하여 파일 내에서 업데이트할 수 있습니다.메모리 매핑파일은 내부에서 페이지 단위로 처리되기 때문에 리니어 파일액세스(예를 들어 플랫파일 데이터 스토리지나 컨피규레이션파일 등)에서는 새로운 페이지 경계를 넘었을 때만 디스크액세스가 필요하며, 1회의 조작으로 파일의 큰 부분을 디스크에 쓸 수 있습니다.
메모리 매핑된 파일의 가능한 이점은 "lazy loading"이며, 따라서 매우 큰 파일이라도 적은 양의 RAM을 사용합니다.사용 가능한 메모리 용량보다 훨씬 큰 파일의 전체 내용을 로드하려고 하면 운영 체제가 디스크에서 메모리로 읽으면서 동시에 메모리에서 디스크로 페이지를 다시 쓰기 때문에 심각한 스레싱이 발생할 수 있습니다.메모리 매핑은 페이지 파일을 완전히 바이패스할 수 있을 뿐만 아니라 데이터 편집 시 작은 페이지 크기의 섹션을 로드할 수 있습니다.이것은 프로그램에 사용되는 페이징 요구와 비슷합니다.
메모리 매핑프로세스는 가상 메모리 매니저에 의해 처리됩니다.가상 메모리 매니저는 페이지 파일 처리를 담당하는 서브시스템과 동일합니다.메모리 매핑파일은 한번에 1페이지씩 메모리에 로드됩니다.페이지 사이즈는, operating system에 의해서 최대의 퍼포먼스를 얻을 수 있도록 선택됩니다.페이지 파일 관리는 가상 메모리 시스템에서 가장 중요한 요소 중 하나이기 때문에 일반적으로 파일의 페이지 크기 섹션을 물리 메모리에 로드하는 것은 매우 최적화된 시스템 기능입니다.[8]
종류들
메모리 매핑 파일에는 다음 두 가지 유형이 있습니다.
지속적
지속 파일은 디스크의 소스 파일과 연결됩니다.마지막 프로세스가 완료되면 데이터는 디스크의 소스 파일에 저장됩니다.메모리 매핑된 이러한 파일은 매우 큰 소스 [9]파일을 사용하는 데 적합합니다.
비지속적
비영구 파일은 디스크의 파일과 연결되지 않습니다.마지막 프로세스가 파일 작업을 마치면 데이터가 손실됩니다.이러한 파일은 Inter-Process Communications(IPC;[9] 프로세스 간 통신)용 공유 메모리를 작성하는 데 적합합니다.
결점
메모리 매핑파일 I/O를 선택하는 주된 이유는 퍼포먼스입니다.그럼에도 불구하고, 트레이드오프가 있을 수 있습니다.표준 I/O 방식은 시스템 콜 오버헤드와 메모리 복사로 인해 비용이 많이 듭니다.메모리 매핑 접근법은 데이터 블록이 페이지 캐시에 로드되지만 아직 프로세스의 가상 메모리 공간에 매핑되지 않은 경우 사소한 페이지 장애에 비용이 발생합니다.경우에 따라 메모리 매핑 파일 I/O가 표준 파일 I/[10]O보다 상당히 느릴 수 있습니다.
메모리 매핑 파일의 또 다른 단점은 특정 아키텍처의 주소 공간에 관한 것입니다.주소 가능 공간보다 큰 파일에는 한 번에 매핑된 부분만 있을 수 있기 때문에 읽기가 어렵습니다.예를 들어 인텔의 IA-32와 같은 32비트 아키텍처는 4GiB 이하의 파일만 직접 수신처로 지정할 수 있습니다.개별 프로그램에서 사용할 수 있는 주소 지정 가능 공간은 훨씬 적습니다.일반적으로 운영체제 커널에 따라서는 2~3 GiB 범위입니다.그러나 이 단점은 최신 64비트 아키텍처에서는 사실상 사라졌습니다.
또한 Linux를 비롯한 많은 운영 체제에서는 페이지 장애를 처리하는 코어 수에 제한이 있기 때문에 mmap은 표준 파일 I/O 수단보다 확장성이 떨어지는 경향이 있습니다.최신 NVM Express SSD와 같은 초고속 장치는 오버헤드를 심각한 [11]문제로 만들 수 있습니다.
매핑 메모리에 액세스 하고 있을 때의 기본 파일의 I/O 에러(리무버블 드라이브의 플러그가 빠져 있거나 옵티컬 미디어가 이젝트 되어 있는 경우, 기입시에 디스크가 가득 찬 경우 등)는, POSIX 에서는 SIGSEGV/SIGBUS 신호로서 애플리케이션에 보고되어 Windows 에서는 EXECUTE_IN_PAG_ERROR 구조화 예외가 발생합니다.매핑 메모리에 액세스하는 모든 코드는 메모리에 액세스할 때 일반적으로 발생하지 않는 이러한 오류를 처리할 수 있도록 준비해야 합니다.
MMU를 사용하는 하드웨어 아키텍처만이 메모리 매핑파일을 지원할 수 있습니다.MMU가 없는 아키텍처에서는 매핑 요구가 있을 때 운영체제는 파일 전체를 메모리에 복사할 수 있지만, 이 작업은 매우 낭비적이고 파일에 조금만 액세스할 경우 속도가 느립니다.또한 사용 가능한 메모리에 들어가는 파일만 사용할 수 있습니다.
일반적인 용도
메모리 매핑파일의 가장 일반적인 용도는 대부분의 최신 운영체제(Microsoft Windows 및 Unix 계열 시스템 포함)에서 프로세스 로더입니다.프로세스가 시작되면 운영체제는 메모리 맵파일을 사용하여 실행 가능 파일과 로드 가능한 모듈을 메모리에 가져와 실행합니다.대부분의 메모리 매핑시스템은 디맨드페이징이라고 불리는 기술을 사용합니다.이 기술은 파일을 서브셋(각각 1페이지)의 물리 메모리에 로드하는 것으로, 그 페이지가 실제로 [12]참조되고 있는 경우에 한정됩니다.실행 파일의 특정의 경우, OS 는 실제로 실행할 필요가 있는 프로세스 이미지의 부분만을 선택적으로 로드할 수 있습니다.
메모리 매핑파일의 다른 일반적인 용도는 여러 프로세스 간에 메모리를 공유하는 것입니다.현대의 보호 모드 운영 체제에서는 일반적으로 프로세스가 다른 프로세스에서 사용하도록 할당된 메모리 공간에 액세스할 수 없습니다.(프로그램이 이를 시도하면 잘못된 페이지 장애 또는 분할 위반이 발생합니다.)메모리를 안전하게 공유할 수 있는 방법은 여러 가지가 있으며 메모리 매핑 파일 I/O가 가장 일반적인 방법 중 하나입니다.두 개 이상의 응용 프로그램이 하나의 물리적 파일을 메모리에 동시에 매핑하고 이 메모리에 액세스할 수 있습니다.예를 들어 Microsoft Windows 운영체제는 응용 프로그램이 시스템 페이지 파일 자체의 공유 세그먼트를 메모리 매핑하고 이 섹션을 통해 데이터를 공유하는 메커니즘을 제공합니다.
플랫폼 지원
대부분의 최신 운영 체제 또는 런타임 환경은 어떤 형태로든 메모리 매핑된 파일 액세스를 지원합니다.함수mmap()[13]은 파일 기술자, 파일 내의 시작 위치 및 길이를 지정하여 파일 매핑을 만듭니다.따라서 UNIX, Linux, Mac OS[14] X 또는 OpenVMS와 같은 다양한 POSIX 준거 시스템은 메모리 매핑을 위한 공통 메커니즘을 지원합니다.Microsoft Windows operating system에서는, Create File Mapping()[15]등의 API 함수 그룹도 서포트되고 있습니다.
Microsoft Windows 및 POSIX 준거 플랫폼용 메모리 매핑파일의 무료 포터블 실장은 다음과 같습니다.
- Boost.Interprocess,[16] Boost C++ 라이브러리의
- Boost.Istreams,[17] Boost C++ 라이브러리에도 있습니다.
- Fmstream[18]
- Cpp-mmf[19]
Java 프로그래밍 언어는 다음과 같은 메모리 매핑 파일에 액세스하는 클래스 및 메서드를 제공합니다.FileChannel
.
D 프로그래밍 언어는 표준 라이브러리(std.mmfile 모듈)[20]에서 메모리 매핑 파일을 지원합니다.
Ruby에는 메모리 매핑된 파일 객체를 구현하는 Mmap이라는 보석(라이브러리)이 있습니다.
버전 1.6 이후 Python은 표준 [21]라이브러리에 mmap 모듈을 포함시켰습니다.모듈의 자세한 내용은 호스트 플랫폼이 Windows 또는 Unix 중 어느 쪽인지에 따라 달라집니다.
Perl의 경우 CPAN의 메모리 매핑파일에 사용할 수 있는 모듈이 몇 개 있습니다.예를 들어 Sys::Mmap[22] 및 파일::맵.[23]
Microsoft 의 경우.NET 런타임, P/Invoke를 사용하여 Windows API를 통해 메모리 매핑 파일을 직접 사용할 수 있습니다.메모리 매핑 파일에 대한 관리 액세스(P/Invoke 불필요)는 런타임 버전 4에서 도입되었습니다(메모리 매핑 파일 참조).이전 버전에는 관리 API를 [24]제공하는 타사 라이브러리가 있습니다.
PHP는 file_get_contents()와 같은 많은 네이티브 파일 액세스 함수에서 메모리 매핑 기술을 지원했지만 5.3에서는 이를 삭제했습니다(리비전 로그 참조).
R 프로그래밍 언어의 경우 Boost 라이브러리를 사용하여 R에 직접 메모리 매핑된 백업 어레이를 제공하는 빅 메모리라고 불리는 라이브러리가 CRAN에 존재합니다.패키지 ff는 메모리 매핑된 벡터, 매트릭스, 어레이 및 데이터 프레임을 제공합니다.
J 프로그래밍 언어는 적어도 2005년부터 메모리 매핑 파일을 지원했습니다.박스형 어레이 데이터 및 단일 데이터 유형 파일 지원이 포함됩니다.지원은 'data/jmf' J의 Jdb 및 JD 데이터베이스 엔진은 열 저장소에 메모리 매핑 파일을 사용합니다.
레퍼런스
- ^ a b Chris Siebenmann (7 June 2018). "The history of Unix's confusing set of low-level ways to allocate memory".
- ^ 개발은 1969년에 시작되어 1976년에 출하되었습니다.
- ^ "TOPS-20 Monitor Calls Reference Manual" (PDF).
- ^ "System 1022 Database System".
We had a PMAP cache for file I/O(like PA1050) in extended sections.
- ^ 1988년 12월
- ^ Jeffrey Richter (October 1995). "Add Growable Memory-Mapped Files to your App". Microsoft Systems Journal. pp. 17–28.
- ^ "Archived copy". Archived from the original on 7 August 2011. Retrieved 21 May 2011.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크) - ^ , "메모리 매핑된 파일의 장점"을 참조하십시오.
- ^ a b "Memory-Mapped Files". Microsoft Developer Network. Retrieved 4 January 2016.
- ^ Matthew Dillon의 http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, 읽기/mmap(또는 IO/페이지 오류)
- ^ Papagiannis, Anastasios; Xanthakis, Giorgos; Saloustros, Giorgos; Marazakis, Manolis; Bilas, Angelos (2020). Optimizing Memory-mapped I/O for Fast Storage Devices. USENIX ATC '20. pp. 813–827.
- ^ "디맨드 페이징"
- ^ 2007년 2월 9일 웨이백 머신에 아카이브된 메모리 맵 파일
- ^ Apple – Mac OS X Leopard – 테크놀로지 – UNIX 2009년 4월 23일 Wayback Machine에서 아카이브 완료
- ^ Create File Mapping 기능(Windows)
- ^ "Sharing memory between processes: Memory Mapped Files". Boost.org.
- ^ "Memory-Mapped Files". Boost.org.
- ^ "Memory Mapped Files for Windows and POSIX systems". SourceForge.
- ^ "cpp-mmf". GitHub.
- ^ "std.mmfile - D Programming Language". Digital Mars. Retrieved 4 December 2011.
- ^ "New Modules in 1.6". Archived from the original on 30 December 2006. Retrieved 23 December 2008.
- ^ "Sys::Mmap Perl Module".
- ^ "File::Map Perl Module".
- ^ DotNet 2010년 4월 19일 Wayback Machine에서 아카이브 완료