Skip to main content

IPC

IPC란?

IPC란 Inter-Process Communication의 약자로 프로세스 간 통신을 말한다.

그렇다면 IPC 즉, 프로세스 간의 통신이 왜 필요할까? 먼저 이것에 대한 해답을 알아보자.

IPC가 필요한 이유

프로세스 구조

위 그림을 보면 알 수 있듯이 프로세스는 완전히 독립된 실행객체이다. 서로 독립되어 있다는 것은 다른 프로세스에 영향을 받지 않는다는 장점이 있지만 서로간의 통신이 어렵게 된다.

프로그램을 실행할 때 하나의 프로세스가 모든 것을 해결하기는 쉽지 않을 것이다. 따라서 프로세스가 서로 통신을 하며 프로그램을 빠르고 효율적으로 사용할 수 있어야 하는데 이때 IPC개념이 필요하게 되었다.

커널 영역에 IPC라는 프로세스들 간에 통신을 제공하고 있다.

크게 IPC가 필요한 상황을 4가지로 나눌 수 있다.

  • 정보 공유 : 여러 사용자가 동일한 정보에 흥미를 가질 수 있기 때문에 병행적으로 접근할 수 있는 환경을 제공하기 위해서
  • 계산 가속화 : 병렬 처리를 통해 계산을 가속화하기 위해서
  • 모듈성 : 시스템 기능을 별도의 프로세스 또는 스레드로 나누어 모듈식 형태로 시스템 구성하기 위해서
  • 편의성 : 한 순간에 많은 task를 작업할 수 있음

그렇다면 IPC의 종류에는 어떤 것들이 있는지 살펴보자.

IPC의 종류

IPC의 종류에는 크게 7가지가 있다.

  • PIPE (파이프)
  • Named PIPE (익명 파이프)
  • Message Queue (메시지 큐)
  • Shared Memory (공유 메모리)
  • Semaphore (세마포어)
  • Memory Map (메모리 맵)
  • Socket (소켓)

각각에 대해 살펴보도록 하자.

PIPE (파이프)

파이프 구조

파이프는 두 개의 프로세스를 연결해, 하나의 프로세스는 데이터를 쓰기만 하고 다른 프로세스는 데이터를 읽기만 하는 단방향 통신 방식이다.

한쪽 방향으로만 통신이 가능하기 때문에 Half-Duplex(반이중)통신 이라고도 불린다.

장점

  • 간단하게 사용할 수 있다는 장점이 있다. 한 방향으로 데이터가 흐르기 때문에 단순한 데이터 흐름에 적합하다.

단점

  • buffer가 상대적으로 작기때문에 overflow될 확률이 높다.

Named PIPE (익명 파이프)

named_pipe 구조

Named PIPE는 통신을 할 프로세스가 명확히 알수 있는 경우에 사용한다. 위의 pipe구조는 부모 자식간에 사용하지만 Named PIPE는 전혀 모르는 상태의 프로세스들 사이에서 통신할 경우에 사용한다. 기본적으로 위의 파이프 구조와 방식이 똑같다고 생각하면 된다. 단방향통신이며 읽기/쓰기가 동시에 이루어지지 않는다.

Message Queue (메시지 큐)

message_queue 구조

이 구조는 FIFO구조로 입출력 방식은 위의 Named PIPE구조와 동일하다. 차이점이 있다면 Named PIPE는 데이터의 흐름이라면 Message Queue는 메모리 공간을 의미한다.

장점

  • 비동기 방식이어서 큐에 넣고 나중에 처리가 가능하다.
  • 다수의 프로세스들이 큐에 메시지를 보낼 수 있고 꺼내는 것도 가능하다.
  • 분산처리 및 경쟁처리 방식에 사용

단점

  • 메시지가 잘 전달되었는지 알 수 없다.
  • 큐에 데이터를 넣고 나오는 과정에서 오버헤드가 발생할 수 있다.
  • 데이터가 많이 쌓일수록 추가적인 메모리가 필요하다.

Shared Memory (공유 메모리)

shared_memory 구조

이 방식은 데이터를 주고받는 방식이라기 보다는 데이터를 공유하는 방식이라고 생각하면 된다. 이 방식은 프로세스간의 메모리 영역을 공유해서 사용할 수 있도록 허용하는 방식이다.

프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다.

장점

  • 중개자 없이 바로 메모리에 접근할 수 있기 때문에 모든 IPC중 가장 빠르다.

단점

  • 데이터를 읽어야하는 시점을 알 수 없다.
  • 커널 설정에 종속적이기 때문에 사용하기 전에 커널에서 허용하고 있는 공유메모리 사이즈를 확인해야 한다.

Semaphore (세마포어)

위에서 설명한 방식들은 데이터 전송을 목적으로 하지만 세마포어는 프로세스 간의 데이터를 동기화하고 보호하는데 그 목적이 있다.

프로세스 간에 메시지 전송을 하거나 공유메모리를 통해 데이터를 공유하게 될 경우, 다수의 프로세스가 자원에 동시에 접근하면 안되며 단지 하나의 프로세스만 접근 가능하게 해주는 것이 세마포어이다.

예를들어, 화장실 칸을 생각하면 되는데 화장실 한 칸에 대해 관리를 하는 것이 뮤텍스이고 화장실 자체를 관리하는게 세마포어가 된다. 세마포어와 뮤텍스에 대해 궁금하다면 앞서 포스팅한 동기화 문제를 살펴보자.

Memory Map (메모리 맵)

메모리 맵은 공유 메모리와 마찬가지로 메모리를 공유한다는 측면에서 비슷하다고 볼수 있다. 차이점이 있다면 메모리 맵은 열린 파일을 메모리에 매핑시켜서 공유한다는 점이다.

Socket (소켓)

socket 구조

소켓은 같은 도메인 내에서 연결 될 수 있고 프로세스들 사이의 통신을 가능하게 한다. 주로 서버와 클라이언트 환경을 구축하는데 용이하다.

장점

  • 범용적인 IPC로써 양방향 통신이 가능하다.
  • 패킷 단위로 주고 받음으로써 직관적으로 이해하기 쉬운 코드를 만들 수 있다.

정리

IPC 종류PIPENamed PIPEMessage QueueShared MemoryMemory MapSocket
사용시기부모 자식 간에 단방향 통신시다른 프로세스와 단방향 통신시다른 프로세스와 단방향 통신시다른 프로세스와 양방향 통신시다른 프로세스와 양방향 통신시다른 시스템간 양방향 통신시
공유 매개체파일파일메모리메모리파일+메모리소켓
통신 단위StreamStream구조체구조체페이지Stream
통신 방향단방향단방향단방향양방향양방향양방향
통신 가능 범위동일 시스템동일 시스템동일 시스템동일 시스템동일 시스템동일 + 외부 시스템

나올 수 있는 면접 질문

  • IPC란 무엇인가요?
  • IPC의 종류에는 어떤 것들이 있나요?
  • 각각의 종류의 통신 방식은 어떤 방식으로 이루어져 있나요?

참고 url

기여자


Kyun Heo

📦