참조 : https://steady-coding.tistory.com/508
참조 : https://yaelimeee.tistory.com/56
IPC란? Inter Process Communication은 프로세스간 데이터를 주고 받는 행위 또는 이에 대한 방법이다
- 사용하는 리소스 : 세마포어, 메시지 큐, 공유 메모리
- 세마포어 : 공유된 자원의 임계 영역 or 데이터 등에 여러 프로세스나 스레드가 접근하는 것을 막아준다
- 임계 영역 : 공유 자원에 대한 동시 접근으로 인한 문제가 발생하지 않도록, 한 번에 하나의 프로세스만 이용하도록 보장해줘야 하는 코드 영역
프로세스는 완전히 독립된 실행 객체이다. 독립되어 있기에 프로세스는 서로 영향을 주지 않는데, 독립되어 있기에 서로 통신이 어렵다. 프로세스간 통신을 위해선 Kernel Space의 IPC를 이용해야 한다
- IPC에는 2 가지 표준, System V IPC와 POSIX IPC가 있다
- System V IPC는 오래된 버전으로 이 기종간 코드 호환성을 확실히 보장해주지만, API가 구식이고, 직관성이 떨어진다
- POSIX IPC는 최신 버전으로 API가 직관적으로 구성되어 있어 사용하기 쉽다
- System V IPC, POSIX IPC 둘 다 Shared Memory, Message Passing을 가지고 있다. POSIX IPC에서는 System V IPC와 다르게 메세지 큐에 대해 알림 기능을 제공한다
- POSIX IPC는 System V IPC를 개선하여 설계했지만, 성능이 무조건 좋은 것은 아니다

Message Passing : Kernel Space에 메세지 전달을 위한 채널을 만들어서, 프로세스들은 해당 채널을 이용해 통신한다. Message Passing Model에는 메세지 큐 / 파이프 / 소켓이 있다
- 장점 : Kernel에서 통신을 제어하므로 별도의 동기화 로직이 필요 없다
- 단점 : 통신에 Kernel이 관여하므로 공유 메모리 보다 속도가 느리다
Shared Memory : 프로세스가 특정 메모리 영역을 공유하여 상호간 통신한다. 공유 메모리는 Kernel이 해당 프로세스에 할당해준다. 그 이후의 통신에는 Kernel이 관여하지 않는다
- 장점 : Kernel 관여 없이 메모리를 직접 사용해서 IPC의 속도가 빠르다
- 단점 : 메시지 전달 방식이 아니기에 데이터를 읽어야 하는 시점을 알 수 없다. 따라서 별도의 동기화 기술이 필요하다
- 여러 프로세스가 공유 메모리의 동일한 위치에 동시에 접근하여 충돌 문제가 발생할 수 있으므로, 세마포어가 필요하다
- Direct Communication : 프로세스의 이름을 표시하여 메시지를 직접 전달하는 방식이다
- 커널에게 수신 프로세스를 명시한 메시지를 전달하면, 커널이 수신 프로세스에게 메시지를 전달해준다
- 양방향 구성이며, 프로세스간 Link가 1:1 로 유일하다
- Indirect Communication : MailBox or Port를 이용해 메시지를 간접 전달하는 방식이다
- Port로 전송을 하기에 복잡한 Link 구성이 가능하다 ( N : N 구성이 가능 )
- Kernel에서 관리하는 메시지 큐를 사용하는데, 송신 프로세스는 큐에 enqueue 하고, 수신 프로세스는 큐에 dequeue 하여 메시지를 주고 받는다
- 장점 : 부모 / 자식 관계가 아니여도 통신이 가능하며, 양방향 통신이 가능하다
- 단점 : 메시지 큐에 메시지들이 쌓이기에 추가 메모리 자원이 필요할 수 있으며, enqueue / dequeue 과정에서 오버헤드가 발생할 수 있다
- 오버헤드 : 처리를 위해 들어가는 간접적인 처리 시간 or 메모리. 예를 들어, '실제 기능을 실행하는데 걸린 시간 ' - ' 원래 기능을 실행하는데 걸리는 시간 ' = ' 오버헤드 ' 이다
- 프로세스를 파이프로 연결하여 1:1 단방향 통신한다. 한쪽은 데이터를 쓰기만 하고, 다른 한쪽은 데이터를 읽기만 한다. 부모 - 자식 간의 단방향 통신으로 사용된다
- 장점 : 단순한 데이터 통신에 적합하다
- 단점 : 용량 제한이 있기에 파이프 용량이 가득 차면 통신이 불가능하다
- 네트워크 소켓을 이용하여 Client - Server 구조로 통신한다. 원격에서 프로세스 간 데이터를 공유할 때 사용. 프로세스는 포트 번호를 이용해 수신 프로세스의 소켓을 찾아간다
- Local 에서만 사용 가능한 다른 IPC 모델들과 달리, 포트를 사용하여 통신하기에 원격 통신이 가능하다
- 범용적인 IPC로서 양방향 통신이 가능하다
Socket 이란?
- Socket : 컴퓨터 네트워크를 경유하는 프로세스 간 통신 ( IPC )의 End Point. 네트워크를 이용해 통신하고자 하는 프로세스는 Socket을 거쳐야 한다
- Socket은 7계층과 4계층 사이에 위치하며, 프로세스는 Socket을 통해 Port와 연결된다
- Socket을 열기 위해선 Host에 할당된 IP, Port 번호, Protocol 정보가 필요하다. Socket은 Port 번호에 Binding 되어, 4계층에서 데이터를 전달할 7계층 애플리케이션을 식별할 수 있다
- 프로세스는 Socket ID를 통해 Socket과 연결된다. 프로세스와 소켓은 1:N 관계이며, 소켓과 Port는 N:1 관계이다. 하나의 프로세스에서 다수의 소켓을 열려면, 소켓이 가지는 프로토콜, Ip 주소, 포트 넘버가 모두 같아야 한다