일반적인 방법으로는 프로세스들 간의 공유가 불가능하지만, 동시에 접근 가능한 메모리 즉 프로세스들이 공유하는 메모리가 필요하다.
공유 메모리(Shared Memory)
- 공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다.
- 프로세스간 Read와 Write를 모두 필요로 할 때 사용한다.
- 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 작동한다.
파이프(Pipe)
- 통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고 받게끔 한다.
- 파이프는 익명 파이프와 네임드 파이프 2가지로 나뉘어진다.
- 익명 파이프(Anonymous PIPE)
- 일반적인 파이프
- 통신할 프로세스가 명확하게 알 수 있는 경우 사용.
- 파이프는 두 개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다.
- 한 쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 반이중통신이라고 부르기도 한다.
- 송/수신을 모두 하기 원한다면 두 개의 파이프를 만들어야 가능하다.
- 간단하게 사용이 가능하고, pipe 함수로 생성한다.
- 단점
- 반이중 통신이라 프로세스가 읽기와 쓰기 통신을 모두 해야한다면, PIPE 두 개를 만들어야 하므로, 구현이 복잡해질 수 있다.
- 전이중 통신을 고려해야될 상황이라면 낭비가 심하게 때문에 좋은 선택이 아니다.
- 네임드 파이프(Named PIPE)
- 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
- 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신 가능.
- 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능하다.
- FIFO라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용한다.
- 외부 프로세스와 통신 가능
- mkfifo or mknod 함수로 생성 가능.
- 단점
- 익명 파이프와 같이 반이중 통신이라는 단점이 있다.
소켓(Socket)
- Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드 포인트이다.
- 네트워크 소켓 통신을 통해 데이터를 공유한다.
- 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
- 전이중(양방향)통신이 가능하다.
- 서버/클라이언트 환경을 구축하는데 용이하다.
- 중대형 어플리케이션에서 주로 사용한다.
메시지 큐(Message Queue)
- 입출력 방식은 Named 파이프와 동일하다.
- 다른점은
- 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간을 사용한다.
- PIPE나 FIFO와는 달리 다수의 프로세스간 메세지를 전달 할 수 있다.
- 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
- 메시지의 접근을 위해서는 키가 필요하다.
메모리 맵(Memory Map)
- 공유 메모리처럼 메모리를 공유해준다.
- 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.
- 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
- FILE IO가 느릴 때 사용하면 좋다.
- 대부분의 운영체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맥 파일을 이용한다.
- 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.