IPC
Inter Process Communication
IPC의 2가지 표준(System V IPC와 POSIX IPC)
System V IPC는 오래된 버전이고 POSIX IPC는 비교적 최근에 개발된 표준이다. System V IPC는 오랜 역사를 가진 만큼 이 기종간 코드 호환성을 확실히 보장해 주지만, API가 오래되었으며, 함수 명도 명확하지 않다. POSIX IPC는 직관적으로 API가 구성되어 있어서 상대적으로 조금 더 사용하기 쉽다고 생각된다.
IPC 설비들
1) PIPE (익명 PIPE)

파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다. 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반 이중) 통신이라고 부르기도 한다.
PIPE는 매우 간단하게 사용할 수 있다. 만약 한쪽 프로세스가 단지 읽기만 하고 다른 쪽 프로세스는 단지 쓰기만 하는, 단순한 데이터 흐름을 가진다면 PIPE를 사용하면 된다. 단점은 반 이중 통신이라는 점으로 만약 프로세스가 읽기와 쓰기 통신 모두를 해야 한다면 PIPE를 두 개 만들어야 하므로, 만약 전 이중 통신을 고려해야 될 상황이라면 익명 PIPE는 좋은 선택이 아니다. 또한 같은 PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능하다.
2) Named PIPE (FIFO)
익명 파이프(Pipe)는 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용한다. 예를 들어 자식과 부모 프로세스간 통신의 경우에 사용할 수 있다. Named PIPE는 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능한데 그 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문이다. Named PIPE의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성된다.
단점으로는, Named PIPE도 PIPE의 또 다른 단점인 읽기/쓰기가 동시에 가능하지 않으며, read-only, write-only만 가능하다. 하지만 통신 선로가 파일로 존재하므로 하나를 읽기 전용으로 열고 다른 하나를 쓰기 전용으로 열어서 이러한 read/write 문제를 쉽게 해결 할 수 있다. 호스트 영역의 서버 클라이언트 간에 전 이중 통신을 위해서는 결국 PIPE와 같이 두 개의 FIFO 파일이 필요하다.
3) Message Queue

Queue(큐)는 선입선출의 자료구조를 가지는 통신 설비로 커널에서 관리한다. 입출력 방식으로 보자면 위의 Named PIPE와 동일하다. Named PIPE와 다른 점이라면 Name PIPE가 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점이다. 파이프는 데이터를 수신하는 프로세스가 고정되어 있지만, 메시지 큐는 커널에서 전역적으로 관리되며(커널 전역변수형태), 모든 프로세스에서 접근 가능하도록 되어있다. 어떤 프로세스가 커널에 요청해서 메시지 큐를 작성하게 되면, 메시지 큐의 접근자(식별자)를 아는 모든 프로세서는 동일한 메시지 큐에 접근함으로써, 데이터를 공유할 수 있게 된다
4) Shared Memory(공유 메모리)
데이터를 공유하는 방법에는 크게 두 가지가 있다. 하나는 통신을 이용해서 데이터를 주고 받는 것이고 다른 하나는 데이터를 함께 사용하는 것이다. PIPE, Named PIPE, Message Queue가 통신을 이용한 설비라면, Shared Memory는 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비다.
프로세스는 자신만의 메모리 영역을 가지고 있다. 이 메모리 영역은 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해서 보호가 되는데, 만약 다른 다른 프로세스의 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV(경고 시그널 - 할당된 메모리의 범위를 벗어나는 곳에서 읽거나, 쓰기를 시도할 때 발생)을 보낸다.
다수의 프로세스가 동작하는 운영체제는 프로세스의 메모리 영역이 반드시 보호되어야 한다. 하지만 메모리 영역에 있는 데이터를 다른 프로세스도 사용할 수 있도록 해야 할 경우도 있다. PIPE 등을 이용해서 데이터 통신을 이용하여 데이터를 전달하는 방법도 있겠지만, Thread처럼 메모리 영역을 공유한다면 더 편하게 데이터를 함께 사용할 수 있을 것이다.
Shared Memory(공유 메모리)는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있습니다.
공유 메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동한다.
5) Memory Map
Memory Map도 Shared Memory(공유 메모리)공간과 마찬가지로 메모리를 공유한다. 차이점은 Memory Map의 경우 열린 파일의 메모리에 매핑시켜 공유한다는 점이다. 파일은 시스템의 전역적인 자원이므로 서로 다른 프로세스들끼리 데이터 공유가 가능하다
6) Socket
Socket은 주로 네트워크 통신을 위해 사용되며, 프로세스간의 통신도 가능하다. 소켓을 사용하기 위해서는 생성해주고, 이름을 지정해야 한다. 또한 domain과 type, Protocol을 지정해야 한다. 서버 단에서는 bind, listen, accept를 해주어 소켓 연결을 위한 준비를 하고, 클라이언트 단에서는 connect를 통해 서버에 요청하며, 연결이 수립 된 이후에는 Socket을 send함으로써 데이터를 주고 받게 된다. 연결이 끝난 후에는 반드시 Socket을 close()해야 한다.