꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

시스템 프로그래밍

메모리와 mmap

gold_dragon 2021. 5. 7. 16:52

동적 메모리 생성

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