| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- ccw 알고리즘
- JavaScript
- SCC
- map
- 벨만-포드
- MongoDB
- 그래프 탐색
- DP
- PROJECT
- R 그래프
- trie
- Spin Lock
- LCA
- 비트필드를 이용한 dp
- Behavior Design Pattern
- 최소 공통 조상
- Github
- localstorage
- 분리 집합
- 강한 연결 요소
- 비트마스킹
- 이분 탐색
- Binary Lifting
- Express.js
- 자바스크립트
- Strongly Connected Component
- 게임 서버 아키텍처
- 2-SAT
- 트라이
- Prisma
- Today
- Total
dh_0e
[OS] IPC(Inter Process communication) 본문
IPC(Inter Process Communication)
- Process들 간에 데이터 및 정보를 주고받기 위한 Mechanism
- Kernel에서 Process에게 System Call 형태로 IPC 도구를 제공
- 필요성
- Process 협력 모델(Cooperating Process Model)을 구현하기 위해 IPC가 반드시 필요함
- ex) DBMS
- 협력하는 프로세스는 실행 중인 다른 프로세스의 영향을 받음
- Process 협력 모델(Cooperating Process Model)을 구현하기 위해 IPC가 반드시 필요함
IPC의 두 가지 모델
1. Shared Memory
- Process의 특정 메모리 영역을 공유하여 통신하는 방식
- 원리: 공유한 Memory 영역에 읽기/쓰기를 통해서 통신을 수행
- 특징
- 응용 프로그램 level에서 통신 기능을 제공
- 공유 메모리가 설정되면, 그 이후의 통신은 Kernel의 관여 없이 진행이 가능해짐
- ex) 데이터베이스

2. Message Passing
- Process간 메모리 공유 없이 메시지를 송/수신하여 통신하는 방식
- 원리: 고정 길이 or 가변 길이 메시지를 송/수신자끼리 주고 받음
- 특징
- Kernel을 통한 메시지 통신 기능을 제공
- Kenel에서 데이터를 버퍼링
- Context Switching에 연관될 수 있음
- Kernel을 통한 메시지 통신 기능을 제공
- 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

- 부모 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에 대해 시그널 핸들러를 등록
- fork로 부모/자식 프로세서 생성
- 자식은 시그널이 올 때까지 잠듦(sigpause)
- 부모는 3초 뒤에 자식에게 SIGUSR1을 보냄(kill)
- 자식은 시그널을 받고 핸들러가 실행되면서 "singal handler"를 출력
- 부모는 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

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)까지는 절대 안 보이고, 상대가 ‘열어둔 포트 번호’만 보임)
- Remote Machine은 Local Machine의 Port만 보임
- 연결(Connection) Semantics: 연결의 특징을 정의할 수 있음
- Reliable(TCP): 신뢰성 있는 연결 지향 통신
- Unreliable (UDP): 신뢰성 없는 비연결형 통신

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

'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 |