본문 바로가기
UNIX 프로그래밍

[8주차 개념] 메모리 매핑

by 서영선 2023. 11. 10.

 

🚩memory mapping

 

  • memory mapping : file을 프로세스의 memory에 mapping. 즉, 프로세스에 전달할 데이터를 저장한 파일을 직접 프로세스의 가상 주소 공간으로 매핑한다. 따라서, read, write 함수를 사용하지 않고도 프로그램 내부에서 정의한 변수를 사용해 파일에서 데이터를 읽거나 쓸 수 있다.
  • 사용 방법 
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
  • addr : 매핑할 메모리 주소
  • len : 메모리 공간의 크기
  • prot : 보호 모드 ( PROT_READ : 읽기 허용, PROT_WRITE : 쓰기 허용 )
  • flags : 매핑된 데이터의 처리 방법을 지정하는 상수 ( MAP_SHARED : 변경 내용 공유, MAP_PRIVATE : 변경 내용 공유하지 않음 )
  • fildes : file descriptor
  • off : file offset (페이지 크기의 배수)

 

  • 페이지 단위 메모리 매핑 실행
  • 매핑된 영역을 벗어나면, SIGBUS, SIGSEGV 발생

 

 

 

🚩memory mapping 예제

int main(void){
	int fd;
    char *addr;
    
    fd=open("data", O_RDWR);
    addr = mmap(NULL, 512, PROT_READ|PROT_WRTIE, MAP_SHARED, fd, 0);
    
    printf("%s\n", addr);
}

 

 

 

 

 

🚩memory mapping 해제

#include <sys/mman.h>
int munmap(void *addr, size_t len);
  • addr : mmap의 반환 값

 

 

🚩 보호모드 변경

#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);

 

 

 

🚩 파일 크기 변경

#include <unistd.h>
int truncate(const char *path, off_t len);


#include <unistd.h>
int ftruncate(int fildes, off_t len);

 

 

 

 

 

🚩 매핑된 메모리 동기화

#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);

 

  • flags 인자 : MS_ASYNC (비동기적 쓰기 작업), MS_SYNC (동기적 쓰기 작업)

 

 

'UNIX 프로그래밍' 카테고리의 다른 글

[9주차 개념] 파이프  (0) 2023.11.14
[7주차 개념] 시그널  (0) 2023.11.10
[4주차 실습] UNIX 실습 문제  (0) 2023.10.22
[3주차 실습] UNIX 실습 문제  (0) 2023.10.22
[2주차 실습] UNIX 실습 문제  (1) 2023.10.22

댓글