동적 메모리 생성
heap 영역에 생성 - malloc 함수
molloc 함수는 heap 영역에 동적으로 메모리를 생성하는 함수입니다. 프로세스 user space에서 heap 영역은 malloc 계열의 함수로 동적 메모리를 할당할 수 있습니다. free() 함수로는 해제할 수 있습니다.
파일 처리 성능 개선 기법 - 메모리에 파일 매핑
ex)
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
// [start+offset] ~ [start+offset+length]만큼의 물리 메모리 공간을 mapping할 것을 요청
// 보통 start: NULL 또는 0 사용, offset: mapping되기 원하는 물리 메모리 주소로 지정
// prot: 보호 모드 설정 (PROT_READ -> 읽기 가능 / PROT_WRITE -> 쓰기 가능 / PROT_EXEC -> 실행 가능 / PROT_NOTE -> 접근 불가)
// flag: 메모리 주소 공간 설정 (MAP_SHARED -> 다른 프로세스와 공유 가능 / MAP_PRIVATE -> 프로세스 내에서만 사용 가능 / MAP_FIXED -> 지정된 주소로 공간 지정)
// fd: device file에 대한 file descriptor
동작 방식
mmap 실행 시, 가상 메모리 주소에 file 주소를 매핑합니다. 해당 메모리에 접근 시 페이지 폴트 인터럽트가 발생하며 OS에서 file data를 복사해서 물리 메모리 페이지에 넣어줍니다. 메모리를 읽을 때 해당 물리 페이지 데이터를 읽으면 됩니다. 쓸 때에는 해당 물리 페이지 데이터 수정 후, 페이지 상태 flag 중 dirty bit를 1로 수정합니다. 파일을 닫을 때 물리 페이지 데이터가 file에 업데이트 됩니다. 파일 엑세스가 적다는 장점이 있습니다.
장점
read(), write() 시 반복적인 파일 접근을 방지하기 때문에 성능이 향상됩니다. mapping 된 영역은 파일 처리를 위한 lseek()을 사용하지 않고 간단한 포인터 조작으로 탐색이 가능합니다.
단점
mmap은 페이지 사이즈 단위로 매핑합니다. 페이지 사이즈 단위의 정수배가 아닌 경우, 한 페이지 정도의 공간을 추가 할당하거나 남은 공간을 0으로 채워주게 됩니다. 즉, 공간 낭비가 생길 수 있습니다.
mapping 해제
ex)
int munmap(void *addr, size_t length)
// *addr에 mapping된 물리 메모리 주소를 해제합니다.
// length: mapping된 메모리 크기입니다. (mmap에서 지정했던 동일한 값을 넣어줍니다.)
'시스템 프로그래밍' 카테고리의 다른 글
스레드 관리 (0) | 2021.05.07 |
---|---|
쉘 스크립트 (0) | 2021.05.07 |
시그널 (signal) (0) | 2021.05.07 |
IPC 기법 (0) | 2021.05.07 |
프로세스 관리 - 프로세스 종료 (0) | 2021.05.06 |