[40일차] | 컴퓨터 밑바닥의 비밀 | 책너두
6.5 mmap: 메모리 읽기와 쓰기 방식으로 파일 처리하기
- 대부분의 경우 프로그래머들은 디스크가 아닌 메모리에 데이터를 읽고쓴다.
- 메모리에서 변수로 작업하는 것에 비해, 디스크에 읽고 쓰는 작업은 번거롭다.
- 이는 디스크와 메모리의 차이로 인한 것이다.
- 메모리와 디스크의 주소 지정 방법이 다르다.
- 두 장치간의 속도 차이가 크다.
6.5.1 파일과 가상 메모리
- 이렇게 다른 메모리와 디스크를 연관짓는 방법은, 가상 메모리를 활용하는 것이다.
- 가상 메모리는 이름 그대로 '가상'이기에, 다루기 편하고 프로그래머가 '수작'을 부릴 여지가 많다.
- 이러한 가상 메모리를 활용해 디스크의 공간을 메모리처럼 프로세스의 주소공간에 사상(mapping) 할 수 있다.
6.5.2 마술사 운영 체제
- 이러한 동작은 모두 운영체제 덕분에 가능하다.
- 이 과정은, 아래와 같은 과정을 거친다.
- 특정 파일을 읽기위해 600~799 범위의 주소 공간을 읽으려고 시도한다.
- 아직 파일이 메모리에 없다면, 페이지 누락 인터럽트가 발생한다.
- 디스크 IO가 발생하며 디스크의 파일이 가상 메모리에 사상된다.
- 프로그램은 가상 메모리에 접근하여 읽고쓰기를 계속한다.
- 운영체제가 가상 메모리와 디스크 사이의 읽고 쓰기 작업을 계속한다.
6.5.3 mmap 대 전통적인 read/write
- read/write 함수는 디스크에서 파일을 읽고 쓸 때 커널을 거쳐야 한다.
- mmap의 경우 커널을 거치지 않는다.
- 따라서, 시스템 콜과 복사에 대한 부담이 적다.
- 다만 별도의 데이터 구조 사용과 페이지 누락 문제가 존재한다.
- 결과적으로 둘 중 어느 것이 무조건 낫다고 말할 수 없다.
6.5.4 큰 파일 처리
- 일반적인 read/write는 파일을 메모리에 직접 복사한 후 작업을 수행한다.
- 이는 파일의 크기가 커질수록 메모리 크기의 제약을 받는다.
- 이로인해 부분적인 작업을 수행해야 하며, 임의 접근의 경우 더욱 어려워진다.
- 반면, 이런 점에서 mmap은 큰 파일을 처리할 때 유용하다.
- 이는 파일을 가상메모리에 사상하므로, 실제 메모리 크기의 제약을 받지 않는다.
- 또한 쓰기작업도 사상된 파일에 직접 쓸 수 있다.
6.5.5 동적 링크 라이브러리와 공유 메모리
- 동적 링크 라이브러리는 아래와 같은 특징을 가진다.
- 많은 프로세스가 하나의 파일을 참조한다.
- 읽기 전용이다.
- 이러한 동적 링크 라이브러리를 매 프로세스마다 메모리에 복사한다면, 상당한 메모리가 낭비될 것이다.
- 따라서, 이 경우에도 mmap을 사용하면, 메모리를 공유할 수 있다.
- 물리 메모리에 적재된 하나의 라이브러리를 여러 가상 메모리에 사상할 수 있다.
6.5.6 mmap 직접 조작하기
6.6 컴퓨터 시스템의 각 부분에서 얼만큼 지연이 일어날까?
- 컴퓨터 시스템의 각 작업에서 발생하는 지연시간(2012)
6.7 요약