1 분 소요

가상 주소 공간과 mmap

vaArea
[출처] : https://devraphy.tistory.com/428

가상 주소 공간의 ‘영역’은
주로 Code, Data (+ bss), heap, stack 등으로 이루어져 있다

그렇다면 mmap으로 할당을 받는 공간은 과연 어디일까?

먼저 mmap은 ‘메모리’의 특정 공간에 파일을 매핑하는데
프로세스가 시스템 콜 등(Open, Read)을 통해 접근하는 것이 아닌,
‘메모리’에 접근하게 하여 성능을 개선해준다
(그 외에도 IPC 등 두 프로세스가 메모리 영역을 공유하기 위하여 사용하기도 한다)
(여담으로 mmap을 사용하여 매핑된 파일 메모리는 file-backed이라 한다)
(물론 IPC 용으로 할당되는 경우는 anonymous 이다)

mmap 실행 시,
가상 메모리 주소에 file 주소를 매핑하고
메모리에 ‘접근’할 때, OS가 파일 데이터를 복사하여 DRAM에 올린다
(Lazy loading, demand page 방식)
(Page Fault가 발생하면 그 때, 필요한 데이터를 메모리에 올림)

mmap이 가상 주소 공간에 매핑될 때,
heap과 stack 사이의 빈 공간에 매핑된다

mmap이 ‘메인 메모리’에 매핑될 때,
Page Table을 사용하는데,
‘가상 메모리 주소 공간’에 할당되는 페이지 번호와
‘물리 메모리 공간’에 할당된 프레임 번호에 대한
연결이 필요하기에 그렇다
(어찌보면 당연하다)

mmap에 대한 TMI들

  • mmap을 통해 파일 수정 시, 해당 페이지의 dirty bit가 활성화된다
    이 때, 수정된 부분에 대한 파일이 기록될 필요가 있음을 OS에게 알려줌
  • mmap을 사용하여 서로 다른 프로세스가 같은 파일을 여는 경우,
    두 프로세스의 가상 주소 공간은 ‘같은 메인 메모리 공간’을 가리키게 된다
    이 때, mmap의 옵션이 MAP_PRIVATE가 아닌 경우는 서로의 파일 변경 사항이 공유된다
    MAP_PRIVATE인 경우, ‘수정’ 시 ‘수정한 부분’에 한하여
    새로운 page를 할당하여 변경된 부분을 관리한다
    (추가적으로 MAP_PRIVATE 옵션을 사용한 경우, fsync 시스템 콜을 호출해도
    원본에 영향을 줄 수 없다)
    (위의 경우는 disk에 새로운 사본을 쓰게 된다)

댓글남기기