본문 바로가기
CS 지식/운영체제

[운영체제] IPC(Inter Process Communication)

by CSEGR 2024. 8. 28.
728x90
IPC(Inter-Process Communication) 은 커널영역(Kernel-mode)에서 하는 프로세스들 간의 통신이다.

✔️ IPC가 필요한 이유

프로세스는 각각 OS로부터 할당된 독립된 공간에서 실행된다.

독립적으로 실행된다는 것은 다른 프로세스에게 영향을 받지 않는다고 말할 수 있다.

(↔︎ 스레드는 프로세스 안에서 자원을 공유하므로 다른 스레드로부터 영향을 받는다. )

 

각각 독립된 공간을 가진 프로세스 간의 통신을 해야하는 상황에서 필요한 통신이 IPC 통신이다. 

프로세스는 커널 영역(Kernel-mode)에서 커널(Kernel)이 제공하는 IPC 설비를 통해 프로세스들 간에 통신(=IPC 통신)을 한다. 


✔️IPC 모델(종류)

➕ Shared Memory : 공유 메모리

 

출처 : https://steady-coding.tistory.com/508

 

  • Shared Memory(공유 메모리)는 IPC 하고자 하는 두 개 이상의 프로세스들이 공유하는 메모리 공간이다. 
  • 두 개 이상의 프로세스들이 주소 공간 일부를 공유하며, 공유한 메모리 영역에 read/write를 통해 통신을 수행한다. 
  • 프로세스가 공유 메모리 할당을 커널(Kernel)에 요청하면, 커널은 해당 프로세스에게 공유 메모리 공간을 할당해주게 된다. 공유 메모리가 설정되면, 그 이후의 통신은 커널(kernel)의 관여없이 진행 가능하다.
  • 장점 
    • 커널의 관여 없이 바로 메모리에 접근할 수 있어서 IPC 속도가 빠르다. 
  • 단점 
    • 메세지 전달 방식이 아니기 때문에 데이터를 읽어야하는 시점을 알 수 없다. → 별도의 동기화 기술이 필요하다. 
    • 동시에 같은 메모리 주소에 접근하는 경우가 발생할 수 있다. (공유 메모리에 접근할 프로세스 간의 Lock 메커니즘 필요)

➕ 메세지 전달 (Message passing) 

: 커널이 제공하는 API 를 이용하여 커널 공간을 통해 통신하는 방식

https://steady-coding.tistory.com/508

  • 커널 메모리 영역에 메세지 전달을 위한 채널을 만들어서 IPC 통신하는 프로세스들 사이에 메세지 형태로 정보를 send/receive하는 방법이다. 
  • 커널을 경유하여 메세지를 송/수신하며, 커널에서는 데이터를 버퍼링한다.
  • 예를 들어, A 프로세스가 커널로 메세지를 보내면 커널이 B 프로세스에게 메세지를 보내주는 방식이다. 
  • 장점
    • 커널에서 데이터 송/수신을 중개하기 때문에 별도의 동기화 로직이 필요없다. 
  • 단점 
    • 커널을 통해서 데이터를 주고 받기 때문에 Shared Memory 모델보다 느리다. 

     ➕ 메세지 전달 모델의 종류

  • Direct Communication

출처 : https://steady-coding.tistory.com/508

       • 송신 프로세스가 커널에 메시지를 보내고, 커널이 수신 프로세스에게 직접 전달함. 
       • 이때, 송신 프로세스는 메세지에 수신 프로세스의 이름을 명시적으로 표기한다. 
       • 프로세스 간의 링크는 유일하고, 대부분 양방향으로 구성된다. 

  • Indirect Communication

출처 : https://steady-coding.tistory.com/508

         • mailbox(또는 port)를 통해 메세지를 간접 전달하는 방식 

         • 송신 프로세스가 수신 프로세스에게 보내고자 하는 메세지를 커널 내부 특정 포트에 저장해 놓고, 수신 프로세스가 해당 포트에 접근
           메세지를 전달하는 방식
         • communication link이 복잡하며 다:다 관계가 가능

 

메세지 전달 모델 예시 (1) : 파이프

출처 : https://steady-coding.tistory.com/508

  • 두 개의 프로세스를 파이프로 연결하여 하나의 프로세스는 데이터를 쓰기만하고 다른 프로세스는 데이터를 읽기만 하여 데이터를 통신한다. 
  • 1:1 통신이며 한 쪽 방향으로만 데이터가 이동한다. 
  • 주로 부모-자식 간의 단방향 통신으로 사용된다. 
  • 용량 제한이 있기 때문에 파이프가 가득 차면 더 이상 쓸 수 없다.
  • 한 쪽 프로세스는 단지 읽기만하고, 다른 프로세스는 단지 쓰기만 하는 단순한 데이터 흐름에 적합하다. 
  • 스트림 기반으로 동작

메세지 전달 예시 (2) : 메세지 큐

  • FIFO 자료 구조를 가지는 큐를 이용하여 데이터를 전송 및 수신하는 방식이다. 
  • 메세지(또는 패킷) 단위로 동작
  • 부모/자식 관계가 아니라도, 메세지의 형태는 사용자가 정의하여 사용할 수 있다. 
  • 양방향 통신이 가능, 메시지의 형태는 사용자가 정의하여 사용 가능하다. 
  • Message Queue에 쓸 데이터에 번호를 붙임으로써 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다. 
메세지 전달 예시 (3) : 소켓

출처 : https://steady-coding.tistory.com/508

  • 소켓 통신은 양쪽 PC에서 각각 임의의 port를 정하고 해당 port 간의 대화를 통해 데이터를 주고받는 방식이다. 
  • 네트워크 소켓을 이용하여 client - server 구조로 데이터 통신을 하며, 원격에서 프로세스 간 데이터를 공유할 때 사용한다. 
  • 프로세스는 포트 번호를 이용하여 통신하려는 상대 프로세스의 소켓을 찾아 데이터를 전송한다.
  • port의 도움으로, 다른 IPC와 달리 프로세스의 위치에 독립적이다. 가령, 다른 IPC는 모두 local에서만 사용할 수 있는 반면, Machine Boundary와 관계없이 Local 또는 Remote로 사용가능하다. 
  • 양방향 통신 가능
  • 서버가 bind, listen, accept을 진행하여 소켓 연결을 위한 준비를 하고, 클라이언트가 connect를 통해 서버에 요청하고 연결이 수립된 후, socke에 send 함으로써 데이터를 주고 받는다. 

 

 

 

#참고 자료 

https://gyoogle.dev/blog/computer-science/operating-system/IPC.html

https://steady-coding.tistory.com/508

728x90