프로세스간 데이터를 주고 받으며 실행되는 cooperating 프로세스에는 데이터를 주고 받는 IPC(Interprocess Comunication)라는 메커니즘이 필요하다.
cooperating 프로세스에서 데이터를 주고 받는 문제를 Producer-Consumer 문제라고도 한다.
예시1: 생산자 - 컴파일러(어셈블리 코드를 전송), 소비자 - 어셈블러(수신한 어셈블리 코드를 기계어로 가공)
예시2: 생산자 - 웹서버(HTML 파일을 전송), 소비자 - 브라우저(HTML 파일 수신)
IPC는 크게 Shared memory, Message passing방식이 있다.
Shared memory
버퍼라는 Shared Memory를 Memory상에 구현하고 생산자 프로세스에서 이 Memory에 접근하여 버퍼를 채우고, 소비자 프로세스에서 버퍼를 비우는 기능을 구현한다.
단점
프로세스에서 Shared Memory에 접근하는 코드를 구현해야하는데 in, out 포인터를 이용하는 등 조금 복잡하다.
버퍼에 접근하는 모든 프로세스마다 코드를 구현해야해서 번거롭다.
Message passing
버퍼 관리 같은 것 없이 데이터를 send, receive하는 코드만 구현한다.
프로세스 간 데이터를 주고 받는 것을 "Communication links가 존재한다"고 한다. Communication links는 두 가지 측면, 즉 direct 하거나 indirect 하도록, 그리고 synchronous 하거나 asynchronous 하도록 만들 수 있다.
direct vs indirect
direct
send, receive 코드에서 프로세스의 이름을 명시하여 프로세스가 직접적으로 데이터를 주고 받음.
indirect
프로세스의 이름을 명시하지 않고 port(mail box라고도 불림) 라는 OS가 관리하는 곳에 데이터를 주고 받음. (포트는 80 포트 등 그 포트가 맞음)
sychronuous vs asychronuous
sychronuous
blocking 방식의 send, receive 방식. 즉, 생산자는 생산한 데이터를 소비자가 소비할 때까지 기다리고 있으며, 소비자는 소비할 데이터를 생산자가 생산해줄 때까지 기다리고 있는 상태. 마치 이것이 서로 상태를 동기화시키는 것과 같다.
asychronuous
non-blocking 방식의 send, receive 방식. 생산자와 소비자는 서로 기다리지 않고 동작하는데, 이는 마치 서로 상태를 동기화하지 않고 동작하는 것과 같다.