CS/OS

[OS] 프로세스의 통신 (IPC: Inter-Process Communication)

Deveun 2021. 7. 29. 05:23

프로세스는 실행되면서 다른 프로세스에 독립적(independent) OR 협력적(cooperating)이다.

여러 프로세스가 서로 협력적인 관계일 때는 프로세스간에 데이터를 공유하게 되는데, 이 때의 통신을 IPC (Inter-Process Communication) 이라고 한다.

즉, IPC란 프로세스간에 데이터를 주고(send) 받는(receive)것을 말한다.

 

특정 A프로세스에서 생산하면 (Producer) 이를 B프로세스에서 소비하는 (Consumer) 협동적인 프로세스간 구조에서의 데이터 통신 방법 2가지를 알아보자.

 

 

IPC 통신방법 1) 공유메모리 사용 (Shared Memory)

: memory 내부에 여러 프로세스에서 접근할 수 있는 공유메모리buffer를 만들어 생산자(Producer)는 버퍼를 채우고(fill), 소비자는 버퍼를 비운다(empty).

이 경우에 공유메모리에 접근하고 데이터를 다루는 것은 모두 코드에서 명시되어야 하는 부분으로 모두 개발자의 역할이었고, 이런 OS는 사람들이 선호하지 않을 수 밖에 없다. 다음에 나오는 메세지 전달(Message Passing)은 바로 이러한 데이터 통신의 역할을 OS가 수행하는 방식이다.

 

출처: Operating System Concepts, 10th Ed. Abraham Silberschatz

 

IPC 통신방법 2) 메세지 전달 (Message Passing)

: 프로세스간 데이터 통신 수단을 OS가 제공해주는 것을 말한다. 생산자(Producer)는 전송메소드 send(), 소비자(Consumer)는 응답메소드 receive()를 사용하고, OS(Kernel Mode)에서 내부 buffer를 관리한다.

 

출처: Operating System Concepts, 10th Ed. Abraham Silberschatz

이 때 프로세스 간 메세지 전달(Message Passing)을 위해서 Communication Links 가 만들어진다.

Communication Links 구현방식에는 여러가지가 있다.

 

더보기

  o Direct: P---->Q 

  <-> Indirect: P----> MailBox(==port) ----> Q (여러 comm link가 생겨날 수 있음)

 

  o Synchronous: (=blocking send) 이전 send가 완료되어야 receive -> 전송완료를 보장해야하는 경우!

  <-> Asynchronous (=non-blocking send)

 

  o Automatic

  <-> Explicit : 출발지 목적지를 정확하게 명시


위의 두 방식들은 하나의 PC에서의 프로세스 통신방법이었다. 그렇다면 Client-Server 관계의 다른 PC의 프로세스간에는 어떻게 메세지를 주고 받을까?

 

 

IPC 통신방법 3) 소켓 (Socket)

소켓은 서로의 endpoint를 특정할 수 있는 IP와 프로세스간 Pipe를 특정하는 Port로 이루어져있다.

Java의 소켓인터페이스의 경우 TCP, UDP, Broadcast 를 지원한다.

출처: Operating System Concepts, 10th Ed. Abraham Silberschatz

 

IPC 통신방법 4) 원격 프로시저 호출 (RPC: Remote Procedure Call)

별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술이다. 다시 말해, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 동일한 코드를 이용할 수 있다. (출처: 위키백과)

 

위키의 설명으로는 RPC가 뭔지 잘 와닿지 않는데, 쉽게 말하면 원격지의 함수를 로컬의 함수처럼 쓰는 것을 말한다.

MSA환경의 경우 각각의 서비스가 다른 언어로 구현되어있는 Polyglot 한 경우가 많은데, 이 때 서비스간의 통신마다 프로토콜을 맞춰줄 필요없이 IDL(언어나 OS가 다를 때 둘을 연결해주는 인터페이스 역할)를 사용하여 쉽게 구현한는 목적으로 주로 쓰인다.

 

https://nesoy.github.io/articles/2019-07/RPC

 

 

[참고]

o https://velog.io/@jakeseo_me/RPC%EB%9E%80

o https://j-i-y-u.tistory.com/18

o https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=neos_rtos&logNo=30185472655