본문 바로가기

Backend study/Backend theory

IPC (Inter-Process Communication)

IPC(Inter-Process Communication)프로세스 간 통신을 의미하며, 하나 이상의 프로세스가 서로 데이터를 주고받는 방법을 제공한다. 현대 운영 체제에서 여러 프로세스가 동시에 실행되며, 프로세스들이 각자의 고유한 메모리 공간을 가지기 때문에, 직접적으로 메모리를 공유하지 않는다. 따라서 서로 간에 정보를 교환하거나 협력해야 할 경우 IPC 메커니즘을 통해 통신해야 한다.

IPC는 동일한 시스템 내의 프로세스들 또는 네트워크를 통한 서로 다른 시스템 간의 프로세스들이 통신할 때 사용된다.

 

IPC의 필요성

각 프로세스는 운영 체제에 의해 독립적인 메모리 공간을 할당받는다. 이 때문에 하나의 프로세스에서 다른 프로세스의 메모리 영역에 직접 접근할 수 없다. 그러나 많은 응용 프로그램은 여러 프로세스 간의 데이터 교환이나 작업 조율이 필요한다. 이를 해결하기 위해 IPC가 사용되며, 주로 다음과 같은 상황에서 필요하다:

  1. 데이터 공유: 여러 프로세스가 동일한 데이터를 공유하거나 협력해야 할 때.
  2. 동기화: 프로세스들이 특정 작업의 완료 시점이나 순서를 동기화해야 할 때.
  3. 리소스 관리: 여러 프로세스가 동일한 자원(예: 파일, 메모리)을 사용할 때 자원의 접근을 제어할 때.
  4. 메시지 전달: 프로세스 간 상태나 이벤트 알림을 주고받을 때.

 

IPC의 주요 방법

다양한 IPC 메커니즘이 있으며, 각 메커니즘은 특정한 사용 시나리오에 적합하게 설계되었다. IPC의 주요 방법은 다음과 같다:

1. 파이프 (Pipes)

파이프란?

파이프는 단방향 또는 양방향 데이터 통신을 가능하게 하는 버퍼 역할을 한다. 하나의 프로세스가 데이터를 파이프에 쓰면 다른 프로세스가 이 데이터를 읽을 수 있다. 파이프는 주로 부모-자식 프로세스 간 통신에서 사용된다.

파이프의 특징

  • 단방향 통신: 기본적인 파이프는 한쪽 프로세스가 쓰면 다른 프로세스가 읽는 단방향 통신을 지원한다.
  • 익명 파이프(Anonymous Pipes): 한 시스템 내에서 부모 프로세스와 자식 프로세스 간의 통신을 제공한다. 주로 간단한 통신을 위해 사용된다.
  • 명명된 파이프(Named Pipes): 시스템 내의 다른 프로세스 또는 네트워크를 통한 통신을 가능하게 하는 파이프이다. 네트워크를 통한 통신에서는 서버-클라이언트 구조로 사용된다.

예시 (익명 파이프)

# 리눅스에서 두 명령어를 파이프로 연결하는 예시
$ ls | grep "example"

여기서 ls 명령어의 출력이 파이프를 통해 grep 명령어로 전달된다.

 

2. 메시지 큐 (Message Queues)

메시지 큐란?

메시지 큐는 프로세스 간에 메시지(데이터 블록)를 주고받을 수 있는 구조로, FIFO(First-In-First-Out) 방식으로 메시지를 전달한다. 메시지 큐는 특정 메시지를 주고받기 위해 식별자를 사용하며, 여러 프로세스 간에 비동기 통신을 지원한다.

메시지 큐의 특징

  • 비동기 통신: 메시지를 전송하는 프로세스는 메시지를 큐에 쓰기만 하면 되고, 받는 프로세스는 언제든지 메시지를 꺼낼 수 있다.
  • 식별자 사용: 메시지 큐는 시스템 내의 고유한 식별자(큐 ID)를 사용하여 여러 프로세스가 동시에 접근할 수 있다.
  • 데이터 보호: 메시지를 주고받는 동안 데이터가 보호되며, 크기나 형식을 제어할 수 있다.

예시

메시지 큐를 사용하면 프로세스가 데이터를 큐에 쓰면, 다른 프로세스가 언제든지 그 메시지를 읽을 수 있다. 운영 체제 API를 사용해 메시지 큐를 생성하고 관리할 수 있다.

 

3. 공유 메모리 (Shared Memory)

공유 메모리란?

공유 메모리는 두 개 이상의 프로세스가 같은 메모리 영역을 공유하여 데이터를 교환하는 방식이다. 운영 체제는 메모리 구획을 생성하여 여러 프로세스가 이 메모리 공간에 접근할 수 있게 하며, 공유 메모리는 가장 빠른 IPC 메커니즘 중 하나로 간주된다.

공유 메모리의 특징

  • 가장 빠름: 프로세스가 직접 메모리 공간을 공유하므로, 데이터를 전달하는 데 필요한 오버헤드가 거의 없다.
  • 동기화 문제: 여러 프로세스가 동시에 공유 메모리에 접근할 수 있기 때문에 동기화 문제(경쟁 조건)가 발생할 수 있다. 이를 해결하기 위해 뮤텍스(Mutex)세마포어(Semaphore) 같은 동기화 메커니즘이 필요하다.

예시

프로세스들이 동일한 메모리 구역에 접근하여 데이터를 읽고 쓰는 방식이다. 각 프로세스는 동일한 공유 메모리 구역을 가리키고 있으며, 동기화가 적절히 관리되지 않으면 데이터 충돌이나 손상 문제가 발생할 수 있다.

 

4. 세마포어 (Semaphores)

세마포어란?

세마포어는 주로 동기화 도구로 사용되며, 공유 자원에 대한 접근을 제어하는 데 사용된다. 여러 프로세스가 동시에 공유 자원에 접근하려고 할 때, 세마포어를 통해 자원 사용을 제한하고 동기화 문제를 해결할 수 있다.

세마포어의 특징

  • 동기화: 여러 프로세스가 동시에 접근하려고 할 때, 세마포어는 자원을 잠그고 해제하는 방식으로 동기화를 관리한다.
  • 자원 제어: 세마포어는 특정 자원에 접근할 수 있는 프로세스의 개수를 제어하여 충돌을 방지한다.
  • 카운팅 세마포어: 카운팅 세마포어는 동시에 여러 프로세스가 접근할 수 있는 자원의 개수를 정의할 수 있다.

예시

세마포어는 일반적으로 뮤텍스(Mutex)와 함께 사용되며, 두 개 이상의 프로세스가 자원에 접근할 때 경쟁 상태(race condition)를 방지하는 데 사용된다.

 

5. 소켓 (Sockets)

소켓이란?

소켓은 네트워크를 통해 원격 프로세스 간에 통신할 수 있는 IPC 메커니즘이다. 소켓은 주로 클라이언트-서버 모델에서 사용되며, 로컬원격 통신을 모두 지원한다.

소켓의 특징

  • 네트워크 통신 지원: 소켓은 네트워크를 통해 다른 시스템의 프로세스와 통신할 수 있다. TCP/IP, UDP 등의 다양한 프로토콜을 사용하여 통신한다.
  • 비동기 통신: 소켓 통신은 비동기적으로 데이터를 전송하고 받을 수 있다.
  • 로컬 소켓: 로컬 시스템 내에서도 소켓을 사용하여 프로세스 간 통신이 가능한다(예: Unix 도메인 소켓).

예시 (TCP 소켓 통신)

# 간단한 TCP 소켓 서버 예시 (Python)
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen()

client_socket, address = server_socket.accept()
data = client_socket.recv(1024)
print(f"Received data: {data.decode('utf-8')}")
client_socket.send(b"Hello from server!")
client_socket.close()

위 예시는 소켓을 사용한 서버가 클라이언트와 데이터를 주고받는 방식의 간단한 TCP 소켓 통신이다.

 

6. 시그널 (Signals)

시그널이란?

시그널은 프로세스에게 특정 이벤트가 발생했음을 알리는 신호이다. 시그널을 통해 프로세스는 작업을 중단하거나 재개할 수 있으며, 보통 운영 체제나 다른 프로세스가 시그널을 보낸다.

시그널의 특징

  • 비동기적: 시그널은 비동기적으로 발생하며, 프로세스가 시그널을 처리하는 동안 다른 작업을 중단할 수 있다.
  • 주로 이벤트 알림: 시그널은 종료, 중단, 재개와 같은 특정 이벤트가 발생했음을 알리기 위해 사용된다.
  • 핸들러: 시그널이 발생하면 프로세스는 시그널 핸들러를 통해 이를 처리할 수 있다.

예시

프로세스가 외부에서 시그널을 받으면 특정 동작을 수행하거나 종료될 수 있다. 예를 들어 SIGINT 시그널은 프로세스를 종료하는 데 사용된다.

 

IPC의 사용 시 고려 사항

  • 동기화: 여러 프로세스가 동시에 동일한 자원에 접근하면 경쟁 조건이 발생할 수 있으므로 동기화 메커니즘을 고려해야 한다.
  • 속도: IPC 메커니즘 중 공유 메모리는 가장 빠르지만, 동기화 문제가 복잡할 수 있다. 반면 소켓은 네트워크 통신을 지원하지만 상대적으로 느리다.
  • 프로세스 간의 관계: 부모-자식 프로세스 간 통신에는 파이프가 적합하고, 독립적인 프로세스 간에는 메시지 큐나 소켓이 유용할 수 있다.
  • 데이터 크기: 전송할 데이터의 크기나 빈도에 따라 적절한 IPC 메커니즘을 선택해야 한다.

 

IPC(Inter-Process Communication)프로세스 간의 데이터 통신을 위한 메커니즘으로, 다양한 방식이 존재하며 각 방식은 특정한 상황에 적합하다. 파이프, 메시지 큐, 공유 메모리, 세마포어, 소켓, 시그널 등은 서로 다른 장점과 특성을 가지고 있으며, 성능, 데이터의 크기, 동기화 필요성 등에 따라 적절한 메커니즘을 선택해야 한다.

IPC는 여러 프로세스가 자원을 공유하고 협력해야 하는 다양한 응용 프로그램에서 필수적인 역할을 한다.

728x90