dh_0e

[OS] IPC(Inter Process communication) 본문

Operating System

[OS] IPC(Inter Process communication)

dh_0e 2025. 11. 14. 23:31

IPC(Inter Process Communication)

  • Process들 간에 데이터 및 정보를 주고받기 위한 Mechanism
  • Kernel에서 Process에게 System Call 형태로 IPC 도구를 제공
  • 필요성
    • Process 협력 모델(Cooperating Process Model)을 구현하기 위해 IPC가 반드시 필요함
      • ex) DBMS
    • 협력하는 프로세스는 실행 중인 다른 프로세스의 영향을 받음

 

IPC의 두 가지 모델

1. Shared Memory

  • Process의 특정 메모리 영역을 공유하여 통신하는 방식
  • 원리: 공유한 Memory 영역에 읽기/쓰기를 통해서 통신을 수행
  • 특징
    • 응용 프로그램 level에서 통신 기능을 제공
    • 공유 메모리가 설정되면, 그 이후의 통신은 Kernel의 관여 없이 진행이 가능해짐
  • ex) 데이터베이스

 

2. Message Passing

  • Process간 메모리 공유 없이 메시지를 송/수신하여 통신하는 방식
  • 원리: 고정 길이 or 가변 길이 메시지를 송/수신자끼리 주고 받음
  • 특징
    • Kernel을 통한 메시지 통신 기능을 제공
      • Kenel에서 데이터를 버퍼링
    • Context Switching에 연관될 수 있음
  • ex) 클라이언트 - 서버 방식의 통신
  • 구현 IPC ex) Pipe, Message Queue, Socket

 

IPC의 기본 동작

방식 통신 연산 Kernel 관여 데이터 처리 특징
Shared Memory Read and Write 초기 설정 시만 관여 응용 프로그램에서 바로 접근 빠름, 보안성은 ↓
Message Passing Send and Receive Kernel 경유 Kernel에서 데이터 버퍼링 문맥 전환 연관
(Overhead 발생 가능)

 

IPC에서 동기화의 필요성

  • Shared Memory - 부가적인 방법이 필요
    • Memory 영역에 대한 동시적인 접근을 제어하기 위한 방법이 필요함
    • 접근 제어 방식은 Locking이나 세마포어(Semaphore) 방법이 있음 
  • Message Passing - Kernel이 동기화 제공
    • Send와 Recieve와 같은 연산에 대해서는 Kernel이 동기화를 제공
    • 프로그램에서 동기화에 대한 고려 없이 사용 가능

 

주요 IPC 구현 기술

Pipe

  • Message Passing 기법에 사용됨
    • 하나의 Process가 다른 Process로 데이터를 직접 전달하는 방법
  • 단방향: 데이터는 한쪽 방향으로만 이동함
    • 따라서 양방향 통신을 위해서는 두 개의 Pipe가 필요 (Half Duplex)
  • 통신 제약: 1대1의 의사소통만 가능
  • 순서 보장: 보내진 순서대로만 받음
  • 용량 제한: Pipe가 꽉 차면 더 이상 데이터를 쓸 수 없음

Pipe 예제: https://www.onlinegdb.com/Z_ZbfEyaO

 

GDB online Debugger | Code, Compile, Run, Debug online C, C++

Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.

www.onlinegdb.com

pipe+fork를 이용해서 부모 프로세스가 자식 프로세스에게 메시지를 보내는 예제

  • 부모 logic에서 close(fd[0])로 read(읽기 끝)를 안 닫으면, 자식이 read() 할 때 EOF가 안 와서 블록되는 상황이 생길 수 있음
  • 마찬가지로 자식은 close(fd[1])로 write(쓰기 끝)를 닫아 fd 누수를 막음
[프로세스 A] -->== 파이프 ==--> [프로세스 B]
              ^             ^
          쓰기 끝         읽기 끝
  • 파이프의 입구/출구의 의미로 end라는 단어로 씀

 

Signal(시그널)

  • 특정 프로세스에게 Kernel을 통해 Event를 전달하는 방법
    • message passing의 한 종류라고 볼 수 있지만 시그널은 "signal 기반 IPC" 또는 "asynchronous notification"으로 따로 취급
  • 송신 Process: 여러 신호 중 하나를 특정 Process에 보냄
    • 이 동작은 수신할 Process의 상태에 무관하게 수행
  • 수신 Process: 신호 종류에 따라 신호 처리 방법을 지정 가능
    • 무시(Ignore)
    • 단순히 신호를 붙잡아 둠(Catch)
    • 특정 처리 루틴(signal Handler)를 두어 처리
  • 비동기적(Asynchronous)으로 동작함
    • 프로세스 A가 B에게 신호를 보내더라도, 신호 처리는 프로세스 B가 스케줄링(CPU 할당) 되어야 가능

Signal 예제: https://www.onlinegdb.com/mmPkB_w7I

 

GDB online Debugger | Code, Compile, Run, Debug online C, C++

Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.

www.onlinegdb.com

부모가 SIGUSR1 시그널을 보내고, 자식이 받는 예제

  1. SIGUSR1에 대해 시그널 핸들러를 등록
  2. fork로 부모/자식 프로세서 생성
  3. 자식은 시그널이 올 때까지 잠듦(sigpause)
  4. 부모는 3초 뒤에 자식에게 SIGUSR1을 보냄(kill)
  5. 자식은 시그널을 받고 핸들러가 실행되면서 "singal handler"를 출력
  6. 부모는 waitpid로 자식이 끝날 때까지 기다리고, 둘 다 종료

 

Shared Memory

  • 두 개 이상의 Process들이 하나의 메모리 영역을 공유하여 통신(Read/Write)하는 방법
    • 장점: 메모리의 직접 사용으로 빠르고 자유로운 통신이 가능
    • 주의 사항: 둘 이상의 프로세스가 동시에 메모리를 변경하지 않도록, 프로세스 간의 동기화가 필수적

Shared Memory 예제: https://www.onlinegdb.com/hMaO2HZxG

 

GDB online Debugger | Code, Compile, Run, Debug online C, C++

Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.

www.onlinegdb.com

공유 메모리를 사용하는 자식 프로세스가 값을 변경하면 부모 프로세스에서도 값이 변경되어 있는 것을 확인하는 코드

  • 포인터만으로 공유 메모리를 구현할 수 없음
    • 자식 프로세스는 부모 프로세스를 복사한 다른 프로세스이므로 메모리 영역이 다름
  • shmget, shmat 같은 system call 사용하여 구현

 

Message Queue

  • 고정된 크기를 갖는 Message의 연결 리스트(Linked List)를 이용하여 통신을 하는 방법
    • 통산 단위: 메시지 단위의 통신이 이루어짐
    • 메시지 형태: 통신하고자 하는 Process 간의 약속이 필요, 사용자가 정의하여 사용
    • 여러 Process가 동시에 접근 가능하며, 동기화가 필요
  • Message Passing 기법에 사용됨

Message Queue 예제: https://onlinegdb.com/MvU3XZ7hw

 

GDB online Debugger | Code, Compile, Run, Debug online C, C++

Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.

www.onlinegdb.com

자식이 Message Queue에 보낸 메시지를 부모가 받는 예제

 

Socket

  • 통신을 위한 끝점(An end-point for communication)을 의미
  • Port를 이용하여 통신하는데 사용됨
    • Port: 운영체제가 제공하는 추상화 개념
    • Port 번호를 이용하여 통신하려는 상대 Process의 Socket을 찾아감
  • 다른 IPC와 달리 프로세스의 위치에 독립적임 (Local or Remote 모두 가능)
    • Local 통신: Port 번호만으로 식별
    • Remote 통신: IP 주소 + Port 번호 조합으로 식별
    • Port를 사용하기 때문에 Machine Bouondary와 관계 없음 (분리된 machine의 프로세스 찾아가기 가능)
    • ex) Port로 여러 Web Browser 생성
      • Remote Machine은 Local Machine의 Port만 보임
        (소켓 내부 구조(FD)까지는 절대 안 보이고, 상대가 ‘열어둔 포트 번호’만 보임)
  • 연결(Connection) Semantics: 연결의 특징을 정의할 수 있음
    • Reliable(TCP): 신뢰성 있는 연결 지향 통신
    • Unreliable (UDP): 신뢰성 없는 비연결형 통신

Socket: 통신을 위한 종점(An end-point for communication)

Socket 예제: https://www.onlinegdb.com/RgnrJUSAx

 

GDB online Debugger | Code, Compile, Run, Debug online C, C++

Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.

www.onlinegdb.com

로컬 TCP 서버/클라이언트 통신 예제

 

 

 

'Operating System' 카테고리의 다른 글

[OS] Synchronization I  (0) 2025.12.04
[OS] Thread  (0) 2025.11.28
[OS] CPU Scheduling  (1) 2025.11.10
[OS] Basic H/W Mechanisms (Bus, I/O Event, Handling and Device Access Mechanisms)  (0) 2025.11.08
[OS] Process, Context Switch  (0) 2025.11.06