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할 때마다 다른 프로세스에게 반영 → 그래서 모두에게 반영되기 전까지 블라킹 됨.
'programming > Unix' 카테고리의 다른 글
[Unix Programming] 11. 세마포어 (0) | 2025.01.16 |
---|---|
[Unix Programming] 10. 파이프 (1) | 2025.01.16 |
[Unix Programming] 8. 시그널 (0) | 2024.12.12 |
[Unix Programming] 7. 프로세스 생성과 실행 (1) | 2024.12.11 |
[Unix Programming] 6. 프로세스 정보 (1) | 2024.12.11 |