가상메모리?
링크 : (나중에 첨부하기)
말이 길어질 것 같으니 따로 글을 써서 링크를 첨부해두겠다.
Memory mapping
파일을 처리하기 위해서는 보통 저수준으로는 파일 디스크립터를 이용하며, 고수준으로 접근하기 위해서는 파일 구조체 포인터를 이용하여 접근하게 된다. 하지만 이런 방식을 이용하면 버퍼를 거쳐서 입출력을 하게 된다.
하지만, mmap()을 이용하여 '메모리 맵 방식'으로 파일을 연결하게 되면 버퍼를 이용하지 않고, Page를 이용하여 데이터 처리가 가능해진다. 상대적으로 크기가 작은 버퍼에 비해 보통 4KB의 크기를 가지는 페이지를 이용하면 처리가능한 크기와 처리 속도가 향상된다. 그렇기 때문에 데이터 크기가 크거나 빠른 처리를 해야하는 경우 메모리 맵 방식을 사용한다.
특징
1. 생성된 메모리 맵을 포인터를 이용하여 쉽게 사용 가능하다.
2. 파일로 연결하여 사용 시, 메모리 – 파일 사이의 동기화가 편하다.
3. IPC로 활용 가능하다.
4. 대용량의 데이터를 사용할 시 성능이 향상된다.
단, 주의점이 있는데,
메모리 맵은 바로 파일을 처리하는게 아니라 가상 메모리로 활용되는 페이지에 맵핑하는 방식이다. 그러므로 파일과 해당 메모리 맵이 된 페이지는 다른 공간이다. 그러므로 커널에 의해 동기화가 될 때까지 서로 다른 데이터를 가질 수 있다. 그러므로 동기화에 대한 주의가 필요하다. IPC로 사용 할 때에도 프로세스간 동기화에 대한 주의도 필요하다.
방법
1. 공유 메모리 맵 방식 (Shared Memory-Map)
: 메모리 맵 변경 시 원본 파일과 데이터가 동기화가 되는 방식
2. 복사 메모리 맵 방식 (Private Memory-Map)
: 처음 메모리 맵에 매핑될 때 파일의 읽어와서 복사하고 그 이후 동기화 하지 않는 방식
메모리 맵 생성 함수 : mmap()
void* mmap(void *state, size_t length, int prot, int flags, int fd, ott_t offset);
이 함수는 페이지 단위로 메모리 매핑을 실행한다.
매핑된 영역의 마지막 페이지에 남은 부분은 0으로 채우며, 매핑된 메모리 영역을 벗어난 공간에 접근하려 하면 SIGBUS 혹은 SIGSEGV 시그널이 발생한다.
호출 성공시 매핑된 메모리의 시작주소를 리턴, 실패 시 MAP_FAILED를 리턴하며, 매핑된 영역의 크기는 [시작주소 + length]이다.
요약을 먼저 해보자면, fd가 가리키는 파일에서 off로 지정한 오프셋부터 length크기만큼 데이터를 읽어 state가 가리키는 메모리 공간에 매핑한다.
인자를 하나씩 보자면,
- state : 할당받기 원하는 메모리 주소, 보통 0을 써서 커널이 적합한 공간을 임의로 할당해 주소를 받을 수도 있고, 직접 입력하여 사용해도 된다. 하지만 직접 입력하는 경우 해당 시스템의 페이지 (배수)단위로 주소 값을 설정해줘야 한다. (더 커야한다는 의미)
- length : 메모리 맵을 할 크기, 바이트 단위로 설정한다.
- prot : 메모리 보호 매커니즘, 플래그 형식이므로 비트 연산으로 복수 속성으로 지정 가능하다.
PROT_EXEC | 해당 페이지 실행 가능 |
PROT_READ | 해당 페이지 읽기 가능 |
PROT_WRITE | 해당 페이지 쓰기 가능 |
PROT_NONE | 해당 페이지 접근 불가 |
단, 매핑할 파일 디스크립터와 속성이 같아야 한다.
만약 파일 디스크립터 속성이 O_RDWR라면, PROT_READ | PROT_WRITE로 복수 지정해주서야 한다.
- flags : 읽어온 데이터를 처리하기 위한 정보를 지정한다. 밑의 세 인자말고, 다른 flag들도 많다.
MAP_SHARED | 공유 메모리 맵 방식 |
MAP_PRIVATE | 복사 메모리 맵 방식 |
MAP_FIXED | 메모리 시작 번지 정확히 지정 시에 사용 |
단, MAP_SHARED, MAP_PRIVATE 둘 중에 한 개만 지정해야 된다.
(둘의 차이는 후에 정확히)
- fd : 메모리 맵 방식을 사용할 파일 디스크립터
- return value : 메모리 맵핑이 이루어진 가상 메모리 주소, 실패 시 MAP_FAILED가 발생하고 errno에 해당 상황에 대한 값이 설정된다.
다음 포스팅은 가상 메모리!!!....라고는 하지만 항상 지킨 적이 없네 ㅎㅎㅎ
[References]
http://blog.naver.com/PostView.nhn?blogId=no1rogue&logNo=30097158983
'System > OS' 카테고리의 다른 글
운영체제 2-1 ~ 2-2] 운영체제의 개요 (0) | 2021.09.19 |
---|---|
운영체제 1-2] 운영체제의 개요 (0) | 2021.09.12 |
운영체제 1-1] 운영체제의 개요 (0) | 2021.09.12 |
Thread 정의와 Thread vs Proces (0) | 2020.04.29 |
Process와 Process Control Block (0) | 2020.04.22 |