동적 메모리 생성하기
파일 처리 성능 개선 기법 - 메모리에 파일 매핑
- [start+offset] ~ [start+offset+length] 만큼의 물리 메모리 공간ㅇ르 mapping할 것을 요청
- 보통 start: NULL 또는 0 사용, offset: mapping되기 원하는 물리 메모리 주소로 지정
- prot: 보호 모드 설정
- PROT_READ(읽기 가능)
- PROT_WRITE(쓰기 가능)
- PROT_EXEC(실행 가능)
- PROT_NONE(접근 불가)
- flags: 메모리 주소 공간 설정
- MAP_SHARED(다른 프로세스와 공유 가능)
- MAP_PRITVATE(프로세스 내에서만 사용 가능)
- MAP_FIXED(지정된 주소로 공간 지정
- fd: device file에 대한 file descriptor
mmap 동작 방식으로 이해하는 메모리 동작 총 정리
- mmap 실행 시, 가상 메모리 주소에 file 주소 매핑 (가상 메모리 이해)
- 해당 메모리 접근 시, (요구 페이징, lazy allocation)
- 페이지 폴트 인터럽트 발생
- OS에서 file data를 복사해서 물리 메로리 페이지에 넣어줌
- 메모리 read시: 해당 물리 페이지 데이터를 읽으면 됨 (메모리 access)
- 메모리 write시: 해당 물리 페이지 데이터 수정 후, 페이지 상태 flag 중 dirty bit를 1로 수정
- 파일 close 시, 물리 페이지 데이터가 file에 업데이트됨 (성능 개선)
파일, 메모리, 가상 메모리
-
장점:
- read() write()시 반복적인 파일 접근을 방지하여 성능 개선
- mapping된 영역은 파일 처리를 위한 lseek()을 사용하지 ㅇ낳고 간단한 포인터 조작으로 탐색 가능
-
단점:
- mmap은 페이지 사이즈 단위로 매핑
- 페이지 사이즈 단위의 정수배가 아닌 경우, 한 페이지 정도의 공간 추가 할당 및 남은 공간을 0으로 채워주게 됨
메모리에 파일 매핑
- addr에 mapping된 물리 메모리 주소 해제한다.
- length: mapping된 메모리의 크기 (mmap에서 지정했던 동일 값을 넣음)
- start: mmap()를 통해 리턴 받은 메모리 맵의 시작 주소.
- length: 동기화를 할 길이. 시작 주소로 부터 길이를 지정하면 된다
- flags
- MS_ASYNC: 비동기 방식, 동기화(Memory→File)하라는 명령만 내리고 결과에 관계 없이 다음 코드 실행
- MS_SYNC: 동기 방식, 동기화(Memory→File)가 될 때까지 블럭 상태로 대기
- MS_INVALIDATE: 현재 메모리 맵을 무효화하고 파일의 데이터로 갱신. 즉, File→Memory.
inode 메타데이터 - stat함수
- inode정보를 한번에 가져올 수 있는 함수
stat 구조체