📌 프로세스간의 통신 (Interprocess Communication)
- 동시에 실행되는 프로세스들은 독립적인 프로세스들이거나 협조하는 프로세스들이다.
- 독립적인 프로세스들은 다른 프로세스들과 공유할 자원이 없고 각자의 메모리 영역을 가지고 있기 때문에, 적절한 CPU 할당만 된다면 운영하는 데 문제가 없다.
- 협조하는 프로세스들은 주로 부모-자식 프로세스 관계이다. 다른 프로세스에게 영향을 주거나, 영향을 받는 관계를 말한다. 특히 다른 프로세스들과 자원을 공유하는 프로세스들을 협조하는 프로세스들이라고 한다.
IPC: Inter-Process Communication
- 서로 협조하는 프로세스들은 IPC 메커니즘을 필요로 한다.
- IPC 메커니즘은 그들이 서로 데이터를 주고 받을 수 있게 한다.
IPC의 두 가지 근본적인 모델

- 공유 메모리(shared memory)
- 두 프로세스가 서로 공유하고자 하는 자원을 공유 메모리에 저장한다.
- message passing
- 두 프로세스가 메시지 큐를 통해 메시지를 전달하고 받을 수 있다. 중간에 개입하는 매체를 운영체제의 커널(kernel)이라고 보면 된다.
📌 공유 메모리 시스템에서의 IPC
"생산자-소비자 문제"를 살펴보자.
- 생산자-소비자 문제는 협조하는 프로세스들 간의 기본적인 문제이다.
- 생산자는 정보를 생산하며, 소비자는 생산자가 생산한 정보를 소비한다.
ex> 웹 서버가 생산한 HTML 파일을 브라우저가 소비함.
공유 메모리를 사용한 해결책은?
- 생산자와 소비자 프로세스 모두 동시에 돌아가도록 허용한다. CPU를 사이좋게 할당받으면서 동시에 실행되도록 한다.
- 이때 buffer 라는 아이템을 사용한다. 생산자는 버퍼를 채울 수 있고, 소비자 프로세스는 버퍼에 채워진 자원을 가져가 사용할 수 있다.
- buffer 는 보통 bounded buffer로 크기 제한이 있기 때문에, 버퍼가 가득 찰 경우 생산자 프로세스는
wait 상태가 된다. 반대로, 버퍼가 비어있을 경우 소비자 프로세스가 wait 상태가 된다.
- 이러한 버퍼를 공유 메모리로 만들면 된다❗️➡️ 보통 큐로 구현.
📌 메세지 패싱 시스템에서의 IPC
🤔 공유 메모리를 사용할 때의 문제점은?
- 협조하는 프로세스들은 메모리의 한 영역을 공유해야 한다.
- 애플리케이션 프로그래머가 공유 메모리에 접근하고 조작하기 위한 코드를 명시적으로 작성해야 한다.
🔮 그래서 메세지 패싱 방식은
- 운영체제가 서로 메세지를 주고 받는 프로세스들에게 메세지 패싱 시설을 통해 서로 통신할 수 있는 수단을 제공한다.
- 프로세스들은 메세지를 던지기만 하면 되고, 수단은 운영체제가 관리한다.

메세지 패싱 시설은 위와 같이 send(message) 와 receive(message) 의 두 가지 연산을 사용한다. 이 연산을 할 때 두 프로세스 사이에 연결되어 있는 communication link를 활용한다.
Communication link가 실행되는 방식
- direct or indirect communication
- synchronous and asynchronous communication
- automatic or explicit buffering
1️⃣-1. 직접적인(Direct) communication
- 의사소통하고자 하는 수신자와 송신자의 이름을 명시적으로 기재해야 한다.
send(P, message): 프로세스 P에게 메세지를 송신.
receive(Q, message): 프로세스 Q로부터 메세지를 수신.
- 이 경우, 단 하나의 communication link가 자동으로 생성된다.
1️⃣-2. 비직접적인(Indirect) communication
- 메세지는 port로 보내지고, port로부터 받을 수 있다.
- port는 프로세스들에 의해 메시지를 배치하고 메시지를 제거할 수 있는 추상적인 객체이다.
send(A, message): 포트 A에게 메세지를 송신.
receive(A, message): 포트 A로부터 메세지를 수신.
- 이 경우 두 프로세스가 같은 포트를 사용할 때만 단 하나의 communication link가 생성된다.
- 또한 이 경우 생성되는 링크는 두 개 이상의 프로세스들과 연결될 수 있으며, 여러 개의 링크가 생성되는 것 또한 가능하다.
🧐 여기서 운영체제는 무얼 하는가?
- port를 생성(create)한다.
- port를 통해 메세지를 송신(send)하고 수신(receive)한다.
- port를 삭제(delete)한다.
2️⃣-1. synchronous(blocking) I/O
- 송신자는 버퍼에 저장된 메세지의 수신이 완료될 때까지 block된다.
- 수신자는 메세지 수신이 가능하기 전까지는 block된다.
2️⃣-2. asynchronous(non-blocking) I/O
- 송신자는 버퍼에 메세지를 보낸 후, 다른 일 처리가 가능하다.
- 수신자는 유효한 메세지를 수신하거나, null을 리턴하고 다른 일 처리를 한다.
Reference
🦖 운영체제 공룡책 강의