일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- CV
- TensorFlow
- 영상처리
- Computer Vision
- 운영체제
- C언어
- 코딩
- 턱걸이
- c
- 학습
- 프로세스
- 시스템프로그래밍
- 회귀
- shell
- Windows 10
- 쉘
- 텐서플로우
- error
- 딥러닝
- 백준
- 알고리즘
- OpenCV
- linux
- 프로그래밍
- 리눅스
- C++
- python
- 공부
- Windows10
- 백준알고리즘
- Today
- Total
줘이리의 인생적기
mmap 본문
프로세스가 파일을 읽고 쓸 때에 굉장한 메커니즘이 필요한다.
메모리 특정 공간에 파일을 미리 올려두고, 접근하기 위해서 프로세스가 메모리에 왔다갔다 할 수 있는 파일 처리 성능 개선 기법에 대해 알아보자
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 |