공유 메모리 시스템의 장단점과 shm_open, truncate, mapp, shm_unlink 를 사용하여 POSIX 에서 할당과 해지가 되는 코드의 예시를 보여준다.
목차
개요
상위의 포스팅에서는 IPC의 개념과 종류에 대해서 알아보았고
2022.08.29 - [OS :: 운영체제] - 프로세스 :: 프로세스 간 통신 IPC
이번 포스팅에서는 IPC의 방식 중 하나인 공유 메모리 시스템에 대해서 자세히 알아볼 것이다.
공유메모리(shared memory)
공유 메모리를 사용한 통신은 두 프로세서가 공통의 메모리에 액세스를 하여 프로세스 간 통신을 하는 경우이다.
일반적으로는 프로세스가 다른 프로세스의 메모리에 접근하는 것을 금지하는데 이러한 제약 조건을 제거한다.
이후 커널에 공유 메모리 공간을 요청하고 생성된 공유 메모리에 접근이 가능한 식별자 'id'를 얻게된다 (정수형) 이후에 생성된 공유메모리를 프로세스에 attach 시켜주고 사용을 하게 된다.
또한 이러한 공유 메모리에는 버퍼(buffer) 라는 개념이 들어가게 되는데 이는 공유메모리 같은 생산자 - 소비자 프로세스의 문제에 대해서 생각해보면 편하다.
버퍼에 대한 포스팅
2022.09.01 - [분류 전체보기] - 프로세스 :: 버퍼(Buffer), 버퍼링(Buffering)
POSIX에서의 공유메모리 방식
이식 가능 운영 체제 인터페이스 portable operating system interface
이라는 뜻으로 유닉스 베이스인 운영체제들의 공통 API를 정리하여 이식성 향상을 위해 IEEE가 책정한 인터페이스 규격
우리가 C에서 자주 접한 stdio.h도 C POSIX 기반의 라이브러리이다. 아무튼 이번 포스팅에서 알아 볼 것은 POSIX 시스템을 위해서 구현해놓은 IPC 기법중에 공유메모리 방식을 직접 시스템 콜을 예시로 들어보면서 알아 볼 것이다.
먼저 공유메모리 객체를 생성시킨다. - shm_open
char 형식의 이름
int 형식의 여러가지 oflag
mode
char *name 은 공유메모리 객체의 이름을 지정한다.
공유메모리에 접근하고자 하는 프로세스는 이 이름을 통하여 객체를 언급하게 된다.
또한 이는 fd(파일 디스크립터)내에 저장된다
oflag 는 여러가지가 존재하는데
이는 리눅스의 flags ( 파일을 어떤 방식으로 액세스 할것인지 선택하는 함수)이다.
공유메모리 기법에서 알아둬야할 기능은
O_CREAT로 객체가 존재하지 않을 경우에 생성을 해주고
O_RDWR 객체가 읽기 쓰기가 가능한 상태로 열린다는 것을 알려준다.
그리고 그 뒤에는 어떤 모드로 작동되는지 mode가 int 형으로 쓰여있다. 정수형 권한에 대해 알아보려면 ⬇⬇⬇
객체의 크기를 바이트 단위로 설정한다. - truncate()
위의 명령어의 매개변수를 보게 되면 int 형식의 fd와 객체의 바이트수를 적게 해놓았다. 이떄의 path는 위에 작성한 shm_open(int형) 을 저장해준 인자이다.
fd의 소켓 에러 등 에러들과 return value 가 궁금한 경우 기술 문서를 보기를 바란다.
공유 메모리 객체를 포함하는 메모리 사상파일을 구축한다. - mapp()
위의 명령어의 매개변수를 보게 되면
void 형식의 메모리 맵핑하고자 하는 주소를 가르키는 포인터
PAGE_SIZE의 배수인 매핑하고자 하는 주소의 공간 길이
int 형식의 prot(메모리 보호 모드)
flags로 매핑된 메모리 데이터의 객체타입이나 대응 옵션 복사본 등을 해당 프로세스에서만 보이게 할지 타 프로세스에도 접근을 허가 할지 등을 설정한다.
int 형식의 fildes
오류가 발생하지 않았으면 포팅된 메모리의 파일 포인터를 반환하게 된다.
사용이 끝났으면 액세스가 끝난 공유 메모리를 제거한다. - shm_unlink
위의 명령어의 매개변수를 보게 되면
char 형식의 포인터
해당 함수가 가르킨 공유메모리가 제거된다.
'CS > Operating System' 카테고리의 다른 글
프로세스 :: 버퍼(Buffer), 버퍼링(Buffering) (0) | 2022.09.06 |
---|---|
프로세스 :: 메시지 전달 시스템 at Mach(iOS) (0) | 2022.08.31 |
프로세스 :: 프로세스 간 통신(IPC) 개념, 종류 (0) | 2022.08.29 |
프로세스 :: 생성과 종료 (0) | 2022.08.19 |
프로세스 :: CPU 스케줄링 종류 (0) | 2022.08.18 |