1. IPC(Inter-Process Communication) 개념
- 독립적 메모리 공간
- 운영체제(OS)는 각 프로세스가 서로 다른 가상 메모리 공간(VMS)을 사용하도록 보장합니다.
- 임의로 다른 프로세스 메모리에 접근하면 “해킹”에 해당하고, 정상적인 환경에서는 OS가 이를 방지합니다.
- 왜 IPC가 필요한가?
- 프로세스 간에 데이터를 교환하거나 협업이 필요한 경우, OS가 허용하는 “공식적인 통로”를 사용해야 합니다.
2. IPC 수단: 메모리 기반 vs 파일 기반
2.1 메모리(RAM) 기반 IPC
- 공유 메모리(Shared Memory):
- 여러 프로세스가 동일한 물리 메모리(페이지)를 서로 다른 가상 주소에 매핑받아 사용하는 방식입니다.
- 예: 리눅스의 shmget() / shmat(), Windows의 “Named Shared Memory” 등.
- 특징:
- 매우 빠른 접근 (직접 메모리에 read/write)
- 동기화(Lock, Mutex, Semaphore 등)를 프로그래머가 관리해야 함
- 일반적으로 고정 크기로 할당하기 때문에 확장성은 제한적
- 프로세스가 종료되면 공유 메모리도 함께 해제(또는 OS가 관리)될 수 있음
- DLL을 이용한 공유 데이터 세그먼트(Windows)
- 여러 프로세스가 같은 DLL을 로딩할 때, DLL 내 특정 영역(예: .data 섹션)을 공유할 수 있도록 설정하는 방식입니다.
- #pragma data_seg 등을 사용해 전역 변수 영역을 공동으로 사용하게 만들 수 있음.
- 장점: 매우 고속, 구현 단순 (C/C++ 전역 변수 사용하듯이)
- 단점: 보안/안정성, 동기화 이슈, 특정 Windows 환경에 종속적
2.2 파일(File) 기반 IPC
- 파일(또는 파이프)을 매개로 프로세스들이 데이터 교환
- 파이프(Pipe):
- 한쪽에서 쓰기(write), 다른 쪽에서 읽기(read) 하는 단방향/양방향 스트림 구조
- Unnamed Pipe(부모-자식 프로세스 간), Named Pipe(서로 무관한 프로세스 간)
- 크기가 동적으로 확장되기도 하며, 연속된 바이트 스트림처럼 취급
- 일반 파일:
- open(), write(), read(), close()로 작업
- 데이터가 직렬화(Serialization)되어 기록되므로, 상대적으로 동기화 부담이 적을 수 있음(교대로 쓰고 읽는 구조)
3. 네트워크 확장: 소켓(Socket)과 RPC
- 소켓(Socket)
- 프로세스 간 통신이 네트워크(MQTT, TCP, UDP 등)까지 확장된 형태
- 로컬(동일 머신) 통신에도 소켓을 사용할 수 있으며(localhost), 원격 통신도 동일 방식
- HTTP/3, WebSocket 등을 통해 브라우저-서버 간 양방향 통신이 활발
- RPC(Remote Procedure Call)
- 네트워크로 연결된 원격 프로세스의 함수를 로컬 함수처럼 호출하도록 추상화한 기법
- 내부적으로 소켓(TCP/IP) 등을 사용
- 예: gRPC, JSON-RPC 등이 오늘날 다시 주목받는 이유는 분산 환경(Microservices)에서 호환성과 성능을 높일 수 있기 때문
4. IPC 구조 예시
- Shared Memory + 시그널
- 프로세스 A가 공유 메모리에 데이터를 써 놓고, B에게 시그널/이벤트를 보내 알림
- B는 이벤트를 받으면 공유 메모리를 읽어 처리
- 이때 락(Lock) or 세마포어(Semaphore) 등의 동기화 메커니즘 사용 권장
- 파이프
- 한쪽이 쓰기(Producer), 다른 쪽이 읽기(Consumer)
- 직렬화된(순차적) 데이터 전송 구조라, 동기화 부담이 완화
- 소켓
- 네트워크 기반이므로, 같은 호스트(IPC)에도 쓰이지만 원격지 서버-클라이언트 통신에도 활용
- TCP 연결(스트림) or UDP(비연결성) 방식
5. Windows 특수 IPC: 레지스트리, DLL 공유
- Windows Registry
- 파일과 메모리의 장점을 융합한 “트리 구조형 데이터베이스”
- 속도가 빠르고(메모리 상주) 여러 프로세스가 안전하게 접근 가능(권한/락)
- 일반 파일보다 동시성 제어가 잘 되어 있어, 간단한 IPC 용도로도 사용 가능
- DLL Injection & Hooking
- 특정 .DLL을 다른 프로세스에 “주입(Injection)”하여, 그 프로세스의 API나 함수 호출을 가로채(Hook) 처리
- 예: WinSock API 호출을 가로채어, 패킷을 검사하거나 차단(방화벽 기능)
- 주의: 보안 이슈 및 Windows 내부 구조에 대한 고급 지식 필요. 종종 인터넷 뱅킹 보안 모듈 등이 이런 기법을 활용
7. 요약
- 프로세스 간에는 독립적 주소 공간이 주어지므로, IPC를 이용해 안전하고 정규화된 방식으로 데이터 교환을 해야 합니다.
- IPC 수단은 크게 **메모리 기반(Shared Memory, DLL 세그먼트 등)**과 파일 기반(파이프, 일반 파일), 그리고 이를 네트워크(Socket, RPC) 수준까지 확장한 형태가 있습니다.
- Windows에 특화된 방법으로 레지스트리나 DLL Injection 등이 있으며, 이는 빠른 접근이나 강력한 제어를 가능케 하나, 보안·안정성을 고려해야 합니다.
- 실제 개발에서는 성능, 보안, 동기화 난이도, 유지보수성 등을 종합적으로 검토하여 IPC 방식을 선택합니다.
출처
곰책으로 쉽게 배우는 최소한의 운영체제론 강의 | 널널한 개발자 - 인프런
널널한 개발자 | '넓고 얕게 외워서 컴공 전공자 되기' 강의를 끝낸 분들이 운영체제에 대해 좀 더 깊이 있는 공부를 할 수 있도록 제공되는 강의입니다., 운영체제도 널널한 개발자와 함께! 👨
www.inflearn.com
'운영체제' 카테고리의 다른 글
절대주소와 상대주소 (0) | 2025.01.26 |
---|---|
메모리 관리 개요 (2) | 2025.01.24 |
CPU 스케줄링 (0) | 2025.01.13 |
프로세스와 쓰레드 (0) | 2025.01.12 |
Process의 생성과 복사 (0) | 2025.01.12 |