프로세스는 독립적인 주소 공간을 갖는다고 했다. 때문에 다른 주소 공간을 참조할 수 없는데 멀티 프로세스 환경에서 프로세스간 데이터를 어떻게 주고 받는지에 대해 체크한다.
멀티 프로세스 환경에서 프로세스간 데이터를 주고 받기 위해서 IPC(Inter Process Communication)을 제공한다. 간단하게 IPC는 파이프, 소켓, 파일, 공유 메모리 등이 있고 크게는 공유 메모리와 메시지 전달 방식으로 나뉘게 된다.
프로세스는 독립적인 주소 공간을 가지고 있어서 다른 프로세스와 데이터를 주고 받을 수 없는데 이런 문제를 해결하기 위한 기법이다. IPC를 통해 프로세스간 통신이 가능하게 만들어준다.
크게 공유 메모리 방식과 메시지 전달 방식이 있는데 아래서 다룬다.
공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유하고 공유된 메모리 영역에 읽기와 쓰기를 하면서 통신하는 방식이다.
메모리는 스택-힙-데이터-코드
영역으로 이루어져있지만 공유 메모리를 할당 받으면 스택-힙-데이터-공유메모리-코드
이렇게 메모리 공간에 공유 메모리 공간이 추가가 된다.
공유 메모리가 형성되는 과정은 아래와 같다.
이런 두 과정을 거쳐 공유 메모리 공간이 형성된다.
공유 메모리가 형성되면 공유 메모리에 대한 접근이 일반 메모리 접근과 똑같이 취급되어진다. 한 번 공유 메모리가 형성되면 다음엔 커널의 도움이 없어도 각 프로세스들이 메모리 영역에 접근할 수 있기 때문에 IPC 속도가 빠르다는 특징이 있다.
하지만 프로세스 내의 메모리 공간에 공유 메모리 공간이 할당되어 접근이 수월하고 속도가 빠른 대신 서로 다른 프로세스가 동시에 같은 메모리 위치에 접근하면 일관성 문제가 생기는데 이 문제에 대해서는 커널이 책임지지 않기 때문에 각 프로세스들이 공유 메모리 접근에 대한 동기화 문제를 책임져야 하는 단점이 있다.
메시지 전달은 공유 메모리와 다르게 무조건 커널을 통해 데이터를 전달한다.(send message와 receive message라는 두 가지 연산을 제공 받는다.)
한마디로 데이터를 전달함에 있어 중간에 커널이 중개 역할을 하는 것이다.
메시지 전달의 과정은 아래와 같다.
간단한 과정이다.
메시지 전달은 커널을 무조건 거쳐야 한다는 점 때문에 첫 과정을 제외한 나머지는 직접 메모리에 접근이 가능한 공유 메모리와는 달리 속도가 느리다는 단점이 있다.
하지만 커널이 관여하고 있는 만큼 동시 접근에 대한 충돌을 걱정할 필요가 없어 적은 양의 데이터를 교환하는데 효과적이고 구현이 비교적 쉽다는 장점이 있다.
대표적으로 파이프, 소켓, 메시지 큐 등의 방법이 메시지 전달 방식으로 구현된다.