※ memory-mapped 파일은 가상 메모리의 일부다.
가상 메모리는 파일 또는 파일과 비슷한 리소스의 일부와 byte 단위로 상관관계가 직접 할당된다.
이 리소스는 일반적으로 디스크에 물리적 존재하는 파일이다. 하지만 디바이스, 공유 메모리, 운영 체제가 file descriptor로 참조할 수 있는 기타 리소스일 수도 있다.
파일과 메모리간 상관관계가 만들어지면, 애플리케이션은 매핑된 부분을 진짜 메모리처럼 사용할 수 있다.
※ memory-mapped 파일의 이점은 특히 대용량 파일에서 사용될 때, I/O 성능이 향상되는 점이다.
메모리 맵이 항상 페이지 크기에(4KiB) 맞춰 정렬되므로, 작은 파일의 경우 memory-mapped 파일은 여유 공간을 낭비할 수 있다. 따라서 5KiB 파일은 8KiB를 할당하므로 3KiB가 낭비된다.
※ memory-mapped 파일은 2가지 이유로 파일을 직접 읽고 쓰는 것 보다 빠르다.
첫째, 프로그램의 로컬 메모리를 변경하는 것은 system call을 호출하는 것 보다 훨씬 빠르다.
둘째, 실제로 매핑되는 메모리 영역은 커널 페이지 캐시(파일 캐시)다. 따라서 사용자 공간에 복사본을 만들 필요가 없다. (대부분의 운영 체제에서)
특정 애플리케이션 레벨의 memor-mapped 파일 작업도 실제 물리 파일 작업보다 더 잘 작동한다.
애플리케이션은 파일 데이터에 직접 엑세스하고 업데이트 할 수 있다. 파일의 시작 부분부터 검색하거나 편집된 내용을 임시 위치에 다시 쓸 필요가 없다.
memory-mapped 파일은 페이지 내부에서 처리되므로 선형 파일 액세스에는 새 페이지 경계를 넘을 때만 디스크 액세스가 필요하다. 또한 단일 작업으로 더 큰 파일을 디스크에 쓸 수 있다.
※ memory-mapped 파일의 추가적인 이점은 "lazy loading"이므로 매우 큰 파일에 대해서도 소량의 RAM을 사용한다.
사용 가능한 메모리보다 훨씬 큰 파일의 전체 내용을 로드하려고 하면 운영체제가 디스크에서 메모리로 읽고 동시에 메모리에서 다시 디스크로 페이지를 쓰기 때문에 thrashing(쓰레싱, 메모리 영역에 접근하게 될 때, 메모리에 페이지 부재(=페이지 폴트(Page fault)율이 높은 것)이 발생할 수 있다.
메모리 매핑은 페이지 파일을 완전히 우회할 수 있다. 더해서 요구 페이징과 유사하게 데이터가 편집될 때, 페이지 크기가 더 작은 섹션을 로드할 수도 있다.
※ 메모리 매핑 프로세스는 페이지 파일 처리를 담당하는 동일한 하위 시스템인 가상 메모리 관리자에 의해 처리된다.
memory-mapped 파일은 한 번에 한 페이지 전체를 메모리에 로드한다.
페이지 크기는 최대 성능을 위해 운영체제에서 선택한다.
페이지 파일 관리는 가상 메모리 시스템에서 가장 중요한 요소 중 하나다. 따라서 파일 섹션 크기의 페이지를
물리 메모리로 로드하는 것은 최적화된 시스템 기능이다.
[ 참고 - 메모리 페이징 ]
컴퓨터 운영체제에서 메모리 페이징 은 컴퓨터가 주 메모리 에서 사용하기 위해 보조 저장소에서 데이터를 저장하고 검색 하는 메모리 관리 방식이다. 이 체계에서 운영체제는 페이지 라고 하는 동일한 크기의 블록 에 있는 보조 저장소에서 데이터를 검색한다.
페이징은 최신 운영 체제에서 가상 메모리 구현 의 중요한 부분으로 보조 저장소를 사용하여 프로그램이 사용 가능한 실제 메모리 크기를 초과할 수 있도록 한다.
간단히 말하면, 메인 메모리는 "RAM"이라고 하고 보조 스토리지는 "디스크"( 하드 디스크 드라이브 , 드럼 메모리 또는 솔리드 스테이트 드라이브 등)라고 한다. 메모리 모델 에 따라 페이징 메모리 기능은 일반적으로 메모리 관리 장치(MMU) 또는 메모리 보호 장치(MPU) 를 사용하여 CPU/MCU에 고정 배선되고 운영 체제 커널의 권한 있는 시스템 코드에 의해 별도로 활성화된다.
'Develop > Fundmental' 카테고리의 다른 글
테스트 어떻게 해야 할까...??? (0) | 2023.02.28 |
---|---|
Decorator pattern (데코레이터 패턴) (0) | 2022.05.03 |
Bridge Pattern(브릿지 패턴) (0) | 2022.05.01 |
Adapter Pattern (어댑터 패턴) (0) | 2022.05.01 |
Builder Pattern (빌더 패턴) (0) | 2022.04.28 |
댓글