줘이리의 인생적기

mmap 본문

공부/시스템 프로그래밍

mmap

줘이리 2021. 12. 31. 23:00
728x90

프로세스가 파일을 읽고 쓸 때에 굉장한 메커니즘이 필요한다.

메모리 특정 공간에 파일을 미리 올려두고, 접근하기 위해서 프로세스가 메모리에 왔다갔다 할 수 있는 파일 처리 성능 개선 기법에 대해 알아보자

 

mmap 함수로 메모리에 올릴 수 있으며, 리턴값으로 성공과 실패를 알 수 있다.

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

첫 번째 인자 : 스타트 지점 지정 보통 NULL 이나 0 사용

두 번째 인자 : 길이 지정

세 번째 인자 : 보호 모드 설정

  PROT_READ(읽기 가능) / PROT_WRITE(쓰기 가능) / PROT_EXEC(실행 가능) / PROT_NONE(접근 불가)

네 번째 인자 : 메모리 주소 공간 설정

  MAP_SHARED(다른 프로세스와 공유 가능) / MAP_PRIVATE(프로세스 내에서만 사용 가능) / MAP_FIXED(지정된 주소로 공간 지정)

다섯 번째 인자 : 디마이스 파일에 대한 file descriptor

여섯 번째 인자 : 스타트 + offset 지점의 offset

 

mmap 동작 방식

 - mmap 실행 시, 가상 메모리 주소에 file 주소 범위 매핑

 - 해당 메모리 접근 시, 페이지 폴트 인터럽트 발생. OS에서 file data를 복사해 물리 메모리 페이지에 넣어준다.

 - 메모리 read 시에 해당 물리 페이지 데이터를 읽는다.

 - 메모리 write 시에 해당 물리 페이지 데이터 수정 후, 페이지 상태 flag 중 dirty bit를 1로 수정

 - 메모리 close 시, 물리 페이지 데이터가 file에 업데이트 됨

 

 

mmap 장점

 - read(), write() 시 반복을 방지하여 성능 개선된다.

 - 매핑된 영역은 lseek()를 사용하지 않고 간단한 포인터 조작으로 탐생이 가능하다.

 

mmap 단점

 - 페이지 사이즈 단위로 매핑하므로, 공간 추가 할당이나 남은 공간을 0으로 채워주어야 하는 단점이 있다.

 

 

mmap 해제 할 때

int munmap(void *addr, size_t length)

첫 번째 인자 : *addr에 매핑된 물리 메모리 주소를 해제 한다.

두 번째 인자 : 매핑된 메모리의 크기(mmap 지정 동일 값)

 

 

메모리 값이 변경되어 파일 업데이트를 강제적으로 해줄 때

int msync(void *start, size_t length, int flags);

첫 번째 인자 : mmap()를 통해 리턴 받은 메모리 맵의 시작 주소

두 번째 인자 : 동기화 길이. 시작 주소로 부터 길이를 지정

세 번째 인자 :

   MS_ASYNC : 비동기 방식, 동기화(Memory‑>File)하라는 명령만 내리고 결과에 관계 없이 다음 코 드 실행(따라서, 동기화가 완료안된 상태로 다음 코드 실행 가능)

   MS_SYNC : 동기 방식, 동기화(Memory‑>File)가 될 때까지 블럭 상태로 대기

   MS_INVALIDATE : 현재 메모리 맵을 무효화하고 파일의 데이터로 갱신. 즉 File‑>Memory

 

 

'공부 > 시스템 프로그래밍' 카테고리의 다른 글

Pthread  (0) 2021.12.29
쉘 스크립트  (0) 2021.12.27
tar  (0) 2021.12.24
시그널(signal)  (0) 2021.12.22
프로세스 우선순위 변경  (0) 2021.12.20