본문 바로가기
programming/Unix

[Unix Programming] 9. 메모리 매핑

by je0nsye0n 2024. 12. 12.

memory mapping

*** memory mapping : file을 프로세스의 메모리에 매핑 ***

void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
// fildes가 가리키는 파일에서 off로 지정한 위치부터 len만큼의 데이터를 읽어 addr이 가리키는 메모리 공간에 매핑한다.
  • addr : 매핑할 메모리 주소

→ 단, 잘못된 위치 선정 가능하기 때문에, 그냥 NULL로 적을 것.

  • len : 메모리 공간의 크기

→ 정확히는 페이지 단위

  • prot : 보호모드
    • PROT_READ : 읽기 허용
    • PROT_WRITE : 쓰기 허용
  • flags : 매핑된 데이터의 처리 방법을 지정하는 상수
    • MAP_SHARED : 변경 내용 공유
    • MAP_PRIVATE : 변경 내용 공유하지 않음
  • filedes : file descriptor
  • off : file offset (page 크기의 배수 : 4096)

**** 중요한 점 ****

매핑된 영역을 벗어나면 SIGBUS, SIGSEGV 발생!

어떤 상황에서 어떤 오류가 발생하는지 숙지하고 있는 것이 중요함.

 

memory mapping 관련 시스템 콜 정리

  • 메모리 매핑 해제
int munmap(void *addr, size_t len);
  • 보호 모드 변경
int mprotect(void *addr, size_t len, int prot);
  • file size 변경
int truncate(const char *path, off_t len); // file size를 len으로 변경
int ftruncate(int fildes, off_t len); // open된 파일에 대해
  • 매핑된 메모리 동기화
int msync(void *addr, size_t len, int flags);

 

flag의 인자 :

  • MS_ASYNC : 비동기적 쓰기 작업 // 반영은 되겠지만, 시간차가 발생함
  • MS_SYNC : 동기적 쓰기 작업 // update할 때마다 다른 프로세스에게 반영 → 그래서 모두에게 반영되기 전까지 블라킹 됨.