[OS] IPC(Inter Process Communication)

YUZAMONG·2025년 2월 9일

OS

목록 보기
3/4

IPC(Inter Process Communication)

*프로세스들은 상호독립적이며 메모리를 공유하지 않고 서로 간섭하지 않는다.
프로세스 간 정보를 교환해야 하는 경우 별도 수단을 이용하여 통신하고, 이러한 방법론을 통칭하여 IPC라고 한다.
IPC는 같은 기기 내에 있는 프로세스뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함된다.

IPC 종류 중 파이프, 소켓, RPC는 운영체제가 제공하는 통신 방식이다.

🔗 프로세스란?

분류

통신 범위에 따른 분류

프로세스 내부 통신
하나의 프로세스 내에 여러 스레드가 존재하는 경우로, 전역 변수나 파일을 이용해 데이터를 주고 받는다.

프로세스 간 통신
같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로, 공용 파일 또는 파이프를 사용해 통신한다.

네트워크를 이용한 통신
네트워크로 연결된 여러 컴퓨터가 통신하는 경우로, 소켓 또는 RPC가 여기에 해당한다.

통신 방향에 따른 분류

양방향 통신
데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조이다. 일반적인 통신은 모두 양방향 통신이며, 소켓이 양방향 통신에 해당한다.

반양방향 통신
데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고, 특정 시점에서 한쪽 방향으로만 전송할 수 있는 구조이다. 무전기가 반양방향 통신에 해당한다.

단방향 통신
한쪽 방향으로만 데이터를 전송할 수 있는 구조이다. 전역 변수와 파이프가 단방향 통신에 해당한다.

구현 방식에 따른 분류

대기가 있는 통신
*동기화를 지원하는 통신 방식으로, 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머무른다. 파이프, 소켓이 여기에 해당한다.

대기가 없는 통신
동기화를 지원하지 않는 통신 방식으로, 데이터를 받는 쪽은 *바쁜 대기를 해야 한다. 전역 변수, 파일이 여기에 해당한다.

바쁜 대기(Busy Waiting)
전역 변수를 사용하는 통신 방식은 언제 데이터를 보낼지 데이터를 받는 쪽에서 알 수 잆는 것이 가장 큰 문제다. 때문에 데이터를 받는 쪽에서 계속 확인해야 하는데, 이처럼 상태 변화를 살펴보기 위해 반복문을 무한 실행하며 기다리는 것을 바쁜 대기라고 한다.
시스템 차원에서 큰 자원 낭비이기 때문에 좋지 않은 방법이다.

동기화(Synchronization)
바쁜 대기 문제를 해결하기 위해 데이터가 도착했음을 알려주는 방식이다.

IPC 종류

1. 파이프(Pipe)

커널이 관리하는 버퍼를 사용하여 통신하는 기법으로, 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우에 사용한다.
FIFO 구조로 동작하여 먼저 쓰인 데이터가 먼저 읽히게 된다.
동기화를 지원하여 읽을 데이터가 없을 경우 읽기 프로세스가 자동으로 대기 상태로 들어간다.

익명 파이프(Anonymous Pipe)

부모와 자식 프로세스 간 통신과 같이 통신할 프로세스를 명확하게 알고 있는 경우에 사용한다.
단방향 통신이므로 양방향으로 통신하길 원한다면 두 개의 파이프를 사용해야 한다.
pipe() 시스템 콜로 파이프를 생성할 수 있다.

네임드 파이프(Named Pipe)

이름이 있는 파일을 사용하여 익명 파이프와 달리 전혀 모르는 프로세스들 간의양방향 통신이 가능하다.
파일 시스템 내에서 특별한 파일 형태로 존재하며, mkfifo() 명령어로 생성할 수 있다. 파일 생성 후 여러 프로세스가 접근 가능하다.
일반 파일처럼 데이터를 영구적으로 저장하지 않고 프로세스 간 데이터 전달에 특화된 특수 파일이다.

2. 메시지 큐(Message Queue)

프로세스들이 큐를 통해 데이터를 주고받을 수 있도록 하는 기법이다. 메시지는 큐에 순차적으로 저장되며, 각 메시지는 다른 메시지와 독립적으로 처리된다.

비동기 통신으로, 한 프로세스가 보내는 메시지를 다른 프로세스에서 즉시 처리하지 않고 나중에 꺼내어 처리할 수 있다.

송신자와 수신자가 동시에 존재할 필요 없다.
FIFO로 동작한다. 메모리를 사용하고 구조체를 기반으로 통신한다.

큐의 우선순위를 설정하거나 메시지의 길이를 조정하는 등의 기능으로, 통신의 세밀한 제어가 가능하다.

3. 공유 메모리(Shared Memory)

동일한 물리적 메모리 영역을 참조하여 데이터를 공유하는 방식이다.

프로세스는 자신만의 메모리 영역을 가지고 있고, 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해 보호가 된다.
만약 다른 프로세스가 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV 시그널을 보낸다.

프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다. 이후에는 어떤 프로세스든 중개자 없이 곧바로 해당 메모리에 접근할 수 있기 때문에, 모든 IPC 중에서 가장 빠르게 작동할 수 있다.

4. 소켓(Socket)

소켓은 네트워크 상에서 두 프로세스가 양방향으로 통신할 수 있게 하는 방법으로, 로컬 및 원격 통신이 모두 가능하다.
TCP/IP 또는 UDP와 같은 프로토콜을 사용하여 데이터를 전송한다.
소켓의 설정과 연결은 상대적으로 복잡하며, 네트워크 설정과 연결 관리도 필요하다.

5. RPC(Remote Procedure Call)

한 프로세스가 네트워크로 연결된 다른 프로세스의 원격 함수를 호출하는 방식이다. 호출하는 쪽에서 마치 로컬 함수처럼 원격 함수를 호출할 수 있도록 해준다.
네트워크 지연과 서버의 상태에 의존하기 때문에, 성능 최적화나 예외 처리 등에 대한 고려가 필요하다.

🔗 RPC와 gRPC 자세히 보기


Reference

https://jwprogramming.tistory.com/54

profile
유자맛 찹쌀유과

0개의 댓글