728x90
반응형
SMALL
프로세스 간 통신(IPC, Inter-Process Communication)이란?
컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주고받거나 협력해야 할 때가 있습니다. 이를 프로세스 간 통신(IPC)이라고 해요. 😊
IPC는 운영체제가 프로세스들끼리 정보를 공유할 수 있게 하는 방법이에요.
간단히 말해서, 프로세스들이 서로 대화하거나 파일을 주고받는 방법이에요. 😊
📂 IPC에서 자주 사용되는 개념
- 파이프 (Pipe): 데이터를 한쪽에서 보내면 다른 쪽에서 받을 수 있는 터널 같은 것!
- 소켓 (Socket): 네트워크로 연결된 두 프로세스가 통신하는 방식.
- 공유 메모리: 프로세스들이 같은 메모리 공간을 함께 사용하는 방법.
- 메시지 큐: 데이터를 보내고 받고 할 수 있는 편지함 같은 구조.
파이프 (Pipe)란? 😊
파이프(Pipe)는 두 프로세스(프로그램) 간에 데이터를 주고받을 수 있는 통로예요.
- 한쪽에서 데이터를 쓰면(write), 다른 한쪽에서 데이터를 읽을(read) 수 있는 구조입니다.
- 파이프는 단방향으로 동작하기 때문에, 한 방향으로만 데이터가 흐를 수 있어요.
(만약 양방향 통신이 필요하면, 파이프를 두 개 만들어야 해요!)
📄 쉬운 비유
파이프는 물이 흐르는 관처럼 작동합니다.
- 한쪽 끝에서는 데이터를 보내고, 다른 쪽 끝에서는 데이터를 받습니다.
- 데이터를 보내는 쪽을 쓰기(write), 데이터를 받는 쪽을 읽기(read)라고 해요. 😊
📂 파이프의 특징
- 단방향 통신: 한쪽에서 쓰고 다른 쪽에서 읽을 수 있음.
- 운영체제 지원: 운영체제가 제공하는 기능으로 안정적으로 데이터 전달 가능.
- 부모-자식 관계: 일반적으로 같은 프로그램 안에서 생성된 프로세스들 간에 사용됨.
🐍 파이썬에서 파이프 예제
파이썬에서는 multiprocessing
모듈을 사용하여 간단하게 파이프를 구현할 수 있어요. 😊
from multiprocessing import Process, Pipe
def sender(pipe):
messages = ["안녕하세요! 😊", "파이프 예제입니다.", "마지막 메시지입니다."]
for msg in messages:
pipe.send(msg) # 파이프를 통해 메시지 전송
print(f"보낸 메시지: {msg}")
pipe.close() # 파이프 닫기
def receiver(pipe):
while True:
try:
msg = pipe.recv() # 파이프에서 메시지 읽기
print(f"받은 메시지: {msg}")
except EOFError: # 파이프가 닫히면 종료
break
if __name__ == "__main__":
parent_conn, child_conn = Pipe() # 파이프 생성
# 프로세스 생성: 하나는 데이터를 보내고, 다른 하나는 데이터를 받음
p1 = Process(target=sender, args=(parent_conn,))
p2 = Process(target=receiver, args=(child_conn,))
p1.start() # 데이터 보내는 프로세스 시작
p2.start() # 데이터 받는 프로세스 시작
p1.join() # sender 프로세스 종료 대기
p2.join() # receiver 프로세스 종료 대기
😊 파이썬 코드 설명
Pipe()
parent_conn
은 부모 프로세스용,child_conn
은 자식 프로세스용.
- : 부모 프로세스와 자식 프로세스 간에 데이터를 주고받는 파이프를 생성.
sender()
: 메시지 리스트를 작성하고, 파이프를 통해 메시지를 보냄.receiver()
: 파이프에서 메시지를 하나씩 읽어 출력.- 두 프로세스가 독립적으로 실행되며, 데이터를 일방적으로 전달.
☕ 자바에서 파이프 예제
자바에서는 PipedOutputStream과 PipedInputStream 클래스를 사용하여 파이프를 구현할 수 있어요. 😊
import java.io.*;
public class PipeExample {
public static void main(String[] args) throws IOException {
// 파이프 출력 스트림 (쓰기용)과 입력 스트림 (읽기용) 생성
PipedOutputStream outputStream = new PipedOutputStream();
PipedInputStream inputStream = new PipedInputStream(outputStream);
// 쓰기 스레드 (데이터 전송)
Thread writer = new Thread(() -> {
try {
String[] messages = {"안녕하세요! 😊", "파이프 예제입니다.", "마지막 메시지입니다."};
for (String msg : messages) {
outputStream.write(msg.getBytes()); // 데이터를 파이프로 전송
System.out.println("보낸 메시지: " + msg);
Thread.sleep(500); // 약간의 대기 시간 추가
}
outputStream.close(); // 출력 스트림 닫기
} catch (Exception e) {
e.printStackTrace();
}
});
// 읽기 스레드 (데이터 수신)
Thread reader = new Thread(() -> {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = br.readLine()) != null) { // 파이프에서 데이터 읽기
System.out.println("받은 메시지: " + line);
}
inputStream.close(); // 입력 스트림 닫기
} catch (Exception e) {
e.printStackTrace();
}
});
writer.start(); // 데이터 보내는 스레드 시작
reader.start(); // 데이터 받는 스레드 시작
}
}
😊 자바 코드 설명
PipedOutputStream
과PipedInputStream
outputStream
: 데이터를 쓰는 쪽.inputStream
: 데이터를 읽는 쪽.
- : 두 프로세스 간 데이터 전송을 위한 출력/입력 스트림.
writer
스레드write()
메서드로 문자열 데이터를 바이트 형태로 전달.
- : 메시지 리스트를 작성하고, 파이프를 통해 데이터를 전송.
reader
스레드BufferedReader
를 사용해 읽기 편의성 제공.
- : 파이프에서 데이터를 읽고, 문자열로 변환하여 출력.
📊 파이프 동작 요약 😊
- 쓰기 측(sender)
- 데이터를 보낼 때, 쓰기 스트림(파이프의 한쪽 끝)을 사용.
- : 데이터를 파이프에 쓰는 역할.
- 읽기 측(receiver)
- 데이터를 받을 때, 읽기 스트림(파이프의 다른 끝)을 사용.
- : 데이터를 파이프에서 읽는 역할.
- 파이프의 양쪽 끝이 연결되어 데이터를 한쪽에서 쓰고, 다른 쪽에서 읽을 수 있음.
🛠️ 실행 결과 (예상)
파이썬
보낸 메시지: 안녕하세요! 😊
받은 메시지: 안녕하세요! 😊
보낸 메시지: 파이프 예제입니다.
받은 메시지: 파이프 예제입니다.
보낸 메시지: 마지막 메시지입니다.
받은 메시지: 마지막 메시지입니다.
자바
보낸 메시지: 안녕하세요! 😊
받은 메시지: 안녕하세요! 😊
보낸 메시지: 파이프 예제입니다.
받은 메시지: 파이프 예제입니다.
보낸 메시지: 마지막 메시지입니다.
받은 메시지: 마지막 메시지입니다.
😊 정리
- 파이프는 데이터를 단방향으로 전달할 때 유용한 도구예요.
- 파이썬은
multiprocessing.Pipe
를, 자바는PipedOutputStream
과PipedInputStream
을 사용해 간단히 구현 가능. - 데이터를 보내는 쪽과 받는 쪽을 명확히 구분해야 한다는 점이 중요해요!
이처럼 IPC는 프로그램 간 협력을 가능하게 해줘요. 어렵지 않죠? 😊
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 소켓
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 공유 메모리
반응형
SMALL
'운영체제' 카테고리의 다른 글
[운영체제] 컨텍스트 스위칭(Context Switching) 완벽 이해: 정의, 동작 원리와 비용 (1) | 2024.12.18 |
---|---|
[운영체제] 생산자-소비자 문제 완벽 이해: 세마포어와 뮤텍스를 활용한 동기화 예제 코드 (0) | 2024.12.18 |
[운영체제] 프로세스 간 통신(IPC) 완벽 가이드: 메시지 큐 동작 원리와 Java·Python 예제 (0) | 2024.12.18 |
[운영체제] 프로세스 간 메모리 격리 완벽 이해: Java·Python 예제 코드와 원리 설명 (0) | 2024.12.18 |
[운영체제] 프로세스 동기화 완벽 정리: Mutex, Semaphore 개념과 자바·파이썬 예제 (0) | 2024.12.18 |