메모리 매핑 (Memory Mapping)

lsjoon·2024년 2월 20일
0

CS & PROGRAMMING

목록 보기
11/15

CSAPP : Chap. 9 발췌

Demand-zero page

0으로 초기화 됐지만, 사용되지 않은 페이지

메모리 매핑 (MMAP)


프로그램데이터를 단순하고 효과적으로 메모리에 로드하기 위해 고안된 방법
= 가상 메모리와 파일 시스템의 통합

특징

  • 리눅스에서 가상 메모리 영역의 내용을 디스크의 객체에 연결해서 초기화하는 과정
  • 가상 메모리의 영역에 매핑되는 객체는 일반 파일 또는 무기명 파일 중 하나
  • 어떤 종류의 객체든 관계없이, 매핑이 발생하면(가상페이지가 초기화되면) 커널이 관리하는 특별한 스왑 영역에서 스왑 인 & 아웃(Swap In & out) 과정을 거쳐야 함

객체의 종류


1. 리눅스 파일 시스템 내의 일반 파일

실행가능 목적파일과 같은 일반 디스크의 연속적인 섹션으로 이루어진 파일

  • 파일 섹션은 페이지 크기의 조각들로 나누어지며, 가상 페이지의 초기 내용을 포함
  • 요구 페이징에 의해 CPU가 처음 페이지에 접근하기 전까지, 가상 페이지 중 어떤 것도 물리 메모리에 스왑되어 들어오지 않음

2. 무기명 파일 (= Demand-zero page )

커널이 만든, 모두 이진수 0을 포함하는 파일

  • 물리 메모리에서 희생될 페이지가 dirty하다고 판단하여 0으로 초기화된 상태, 하지만 아직 사용되지 않음

공유 객체


  • 프로세스는 자신만의 가상 주소공간을 가지며, 다른 프로세스들에 의해 잘못된 읽기-쓰기 작업이 발생하는 것을 막음
  • 그러나, 많은 프로세스는 동일한 읽기-코드 영역이 존재함
    = 모든 C 프로그램들이 필요로 하는 표준 C 라이브러리 등 ( stdio.h 의 printf 같은 것들 )
  • 각각의 프로세스를 위해 한정된 물리 메모리 상에 공통 부분을 중복해서 할당하는 것은 비효율적
  • 메모리 매핑을 통해 하나의 객체를 다수의 프로세서들에 의해 공유될 수 있도록 함

객체는 공유 가상 메모리 영역으로 공유 객체 혹은 사적 객체로 매핑 가능

공유 객체를 공유 주소공간으로 매핑

- 이 영역에 쓰는 모든 내용은 자신의 공유 메모리 내로 객체를 매핑해둔 다른 프로세스도 볼 수 있음
- 변경 내용이 디스크 상의 원래 객체에도 반영

사적 객체를 공유 주소공간으로 매핑

- 이 영역에 가한 수정 사항들은 다른 프로세스들은 볼 수 없음
- 변경 내용이 디스크 상의 원래 객체에 반영되지 않음


COW (Copy On Write)


사적 객체들은 copy-on-write 라는 영리한 기법을 사용해서 가상메모리에 매핑
( copy-on-write를 통해 생성되는 사본은 무기명 파일을 기반으로 생성됨
= zero-fill-on-demand-page / demand-zero page )

  • 사적 객체는 공유 객체와 동일한 방법으로 만들어지며, 물리 메모리에 단 한 개의 사적 객체만이 할당
  • 사적 객체를 매핑하는 프로세스들에 대해 PTE(Page Table Entry)는 읽기-허용 권한만 나타냄
  • 만약, '프로세스 1'이 사적 객체의 'C 페이지'에 대해 쓰기를 시도할 경우 보호 오류를 유발
  • 오류 핸들러는 'C 페이지'의 값만 복사한 사본인 'Copy of C 페이지'를 물리 메모리에 할당 후 페이지 테이블을 갱신
  • 최종적으로 '프로세스 1' 의 매핑은 'Copy of C 페이지' 이며, PTE의 권한은 읽기-허용, 쓰기-허용 상태가 됨

활용

  1. fork()
    프로세스를 복제하는 함수
  • 새롭게 생성된 프로세스는 fork한 프로세스의 페이지 테이블을 공유
  • 둘 중 한 쪽이 쓰기를 시도할 경우, copy-on-write 매커니즘을 통해 쓰기를 시도한 페이지의 사본을 할당해줌
  1. execve()
    새로운 프로세스를 실행하는 함수
  • 사적 영역, 공유 영역 각각을 매핑
  • 매핑되는 파일들은 일반 파일 객체와 무기명 파일 객체가 모두 존재
  • 새 프로그램의 코드, 데이터, 스택을 위한 새로운 영역 등을 사적 copy-on-write를 통해 생성
  • 사적 영역에서 매핑된 프로그램이 공유 객체와 연결되면, 이 객체들은 프로그램에 동적으로 링크되며 가상 주소공간의 공유 영역으로 매핑됨
profile
중요한 것은 꺾여도 그냥 하는 마음

0개의 댓글