👓 Operating System
(본 글은 다음 링크를 참조하였습니다.)
https://github.com/gyoogle/tech-interview-for-developer?tab=readme-ov-file
https://dar0m.tistory.com/233
IPC란?
프로세스는 독립적으로 실행된다.
즉, 독립되어 있다는 것은 다른 프로세스에게 영향을 받지 않는다고 말할 수 있다.
(스레드는 프로세스 안에서 자원을 공유하므로 영향을 받는다.)
이런 독립적인 구조를 가진 프로세스 간의 통신을 해야 하는 상황이 있을 것이다.
이를 가능하도록 해주는 것이 바로 IPC 통신이다.
프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스간 통신을 할 수 있게 된다.

[출처] : http://jhnyang.tistory.com
IPC가 필요한 이유 (프로세스 간 통신이 필요한 이유)
- 정보 공유(Information Sharing)
여러 사용자가 동일한 정보에 엑세스 할 필요가 있을 수 있다.
- 가속화 (Computation Speed-up)
특정 작업(task)을 여러 개의 서브 작업(sub-task)로 쪼개어 프로세스의 병렬성을 키움으로써 처리 속도를 높일 수 있다.
이 때, 메인 작업과 서브 작업은 서로 통신의 필요성이 생긴다.
- 모듈화 (Modularity)
특정한 시스템 기능을 별도의 프로세스(스레드)로 구분하여 모듈화된 시스템을 구성할 수 있다.
이 때, 모듈 간의 통신이 필요하다.
- 편의성 (Convenience)
다수의 사용자가 동시에 여러가지 작업을 수행할 수 있다.
IPC 종류
1. 파이프 (Pipe)

(출처 : https://jwprogramming.tistory.com/54)
- 익명 파이프 (Anonymous PIPE)
- 일반적인 파이프
- 통신할 프로세스를 명확하게 알 수 있는 경우 사용
- 부모-자식 or 형제 프로세스 간 통신에 사용
- 외부 프로세스에서 사용 불가!
- 두 개의 프로세스를 연결하며, 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다.
- 한쪽 방향으로만 통신이 가능한 반이중 통신이라고 부른다.
- 송/수신을 모두 원한다면 두 개의 파이프를 만들어야 가능하다.
- pipe 함수로 생성
- 장점 : 매우 간단하게 사용 가능 -> 단순한 데이터 흐름을 가질 때 사용하는 것이 효율적
- 단점 : 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해짐, 낭비가 심하므로 좋은 선택이 아님!
- 네임드 파이프 (Name PIPE)
- 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
- 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신 가능
- 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능한 것
- FIFO라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용
- -> 외부 프로세스와 통신 가능
- mkfifo or mknod 함수로 생성
- 단점 : 익명 파이프와 마찬가지로 반이중 통신이기 때문에 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능
2. 소켓 (Socket)

(출처 : https://dar0m.tistory.com/233)
- 네트워크 소켓 통신을 통해 데이터를 공유한다.
- 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받는 방식이다.
- 이 때 각각 PC의 포트를 담당하는 소켓은 각각 하나의 프로세스이다.
- 즉, 해당 소켓은 임의의 포트를 맡아 데이터 송수신 역할을 수행하는 하나의 프로세스이다.
- 마치 PIPE와 같이 1:1로 데이터를 주고받는 방식이다.
- 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
- 전이중 통신이 가능하다.
- 서버/클라이언트 환경을 구축하는데 용이하다.
- 서버(bind, listen, accept), 클라이언트(connect)
3. 메시지 큐 (Message Queue)

(출처 : https://dar0m.tistory.com/233)
- 입출력 방식은 Name PIPE와 동일하다.
- 차이점
- 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다. (메모리를 사용한 PIPE)
- PIPE나 FIFO와는 달리, 다수의 프로세스간 메시지를 전달할 수 있다.
- 사용할 데이터에 번호를 붙이기 때문에, 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
- 메시지의 접근을 위해서는 키(key)가 필요하다.
4. 메모리 맵 (Memory Map)

(출처 : https://doitnow-man.tistory.com/110)
- 공유 메모리처럼 메모리를 공유해준다.
- 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다. (즉, 공유 매개체가 파일 + 메모리)
- 주로 파일로 대용량 데이터를 공유할 때 사용한다.
- FILE IO가 느릴 때 사용하면 좋다.
- 대부분 운영체제는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상(위치)하기 위해 메모리 맵 파일을 이용한다.
5. 공유 메모리 (Shared Memory)

(출처 : https://dar0m.tistory.com/233)
- 파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비이다.
- 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있다.
- 공유 메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동하게 된다.
- 각 프로세스가 메모리 영역에 첨부됨
- 프로세스간 Read, Write 모두 필요로 할 때 사용한다.
- 대량의 정보를 다수의 프로세스에게 배포 가능하다.
- 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에, 모든 IPC 중에서 가장 빠르게 작동할 수 있다.