운영체제

[운영체제] 프로세스 간 통신(IPC) 완벽 가이드: 파이프(Pipe) 개념과 Java·Python 구현

CodeCaine Explorer 2024. 12. 18. 09:41
728x90
반응형
SMALL

프로세스 간 통신(IPC, Inter-Process Communication)이란?

컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주고받거나 협력해야 할 때가 있습니다. 이를 프로세스 간 통신(IPC)이라고 해요. 😊

IPC는 운영체제가 프로세스들끼리 정보를 공유할 수 있게 하는 방법이에요.
간단히 말해서, 프로세스들이 서로 대화하거나 파일을 주고받는 방법이에요. 😊


📂 IPC에서 자주 사용되는 개념

  • 파이프 (Pipe): 데이터를 한쪽에서 보내면 다른 쪽에서 받을 수 있는 터널 같은 것!
  • 소켓 (Socket): 네트워크로 연결된 두 프로세스가 통신하는 방식.
  • 공유 메모리: 프로세스들이 같은 메모리 공간을 함께 사용하는 방법.
  • 메시지 큐: 데이터를 보내고 받고 할 수 있는 편지함 같은 구조.

파이프 (Pipe)란? 😊

파이프(Pipe)는 두 프로세스(프로그램) 간에 데이터를 주고받을 수 있는 통로예요.

  • 한쪽에서 데이터를 쓰면(write), 다른 한쪽에서 데이터를 읽을(read) 수 있는 구조입니다.
  • 파이프는 단방향으로 동작하기 때문에, 한 방향으로만 데이터가 흐를 수 있어요.
    (만약 양방향 통신이 필요하면, 파이프를 두 개 만들어야 해요!)

📄 쉬운 비유

파이프는 물이 흐르는 관처럼 작동합니다.

  • 한쪽 끝에서는 데이터를 보내고, 다른 쪽 끝에서는 데이터를 받습니다.
  • 데이터를 보내는 쪽을 쓰기(write), 데이터를 받는 쪽을 읽기(read)라고 해요. 😊

📂 파이프의 특징

  1. 단방향 통신: 한쪽에서 쓰고 다른 쪽에서 읽을 수 있음.
  2. 운영체제 지원: 운영체제가 제공하는 기능으로 안정적으로 데이터 전달 가능.
  3. 부모-자식 관계: 일반적으로 같은 프로그램 안에서 생성된 프로세스들 간에 사용됨.

🐍 파이썬에서 파이프 예제

파이썬에서는 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 프로세스 종료 대기

😊 파이썬 코드 설명

  1. Pipe()
    • parent_conn은 부모 프로세스용, child_conn은 자식 프로세스용.
  2. : 부모 프로세스와 자식 프로세스 간에 데이터를 주고받는 파이프를 생성.
  3. sender(): 메시지 리스트를 작성하고, 파이프를 통해 메시지를 보냄.
  4. receiver(): 파이프에서 메시지를 하나씩 읽어 출력.
  5. 두 프로세스가 독립적으로 실행되며, 데이터를 일방적으로 전달.

☕ 자바에서 파이프 예제

자바에서는 PipedOutputStreamPipedInputStream 클래스를 사용하여 파이프를 구현할 수 있어요. 😊

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();  // 데이터 받는 스레드 시작
    }
}

😊 자바 코드 설명

  1. PipedOutputStreamPipedInputStream
    • outputStream: 데이터를 쓰는 쪽.
    • inputStream: 데이터를 읽는 쪽.
  2. : 두 프로세스 간 데이터 전송을 위한 출력/입력 스트림.
  3. writer 스레드
    • write() 메서드로 문자열 데이터를 바이트 형태로 전달.
  4. : 메시지 리스트를 작성하고, 파이프를 통해 데이터를 전송.
  5. reader 스레드
    • BufferedReader를 사용해 읽기 편의성 제공.
  6. : 파이프에서 데이터를 읽고, 문자열로 변환하여 출력.

📊 파이프 동작 요약 😊

  1. 쓰기 측(sender)
    • 데이터를 보낼 때, 쓰기 스트림(파이프의 한쪽 끝)을 사용.
  2. : 데이터를 파이프에 쓰는 역할.
  3. 읽기 측(receiver)
    • 데이터를 받을 때, 읽기 스트림(파이프의 다른 끝)을 사용.
  4. : 데이터를 파이프에서 읽는 역할.
  5. 파이프의 양쪽 끝이 연결되어 데이터를 한쪽에서 쓰고, 다른 쪽에서 읽을 수 있음.

🛠️ 실행 결과 (예상)

파이썬

보낸 메시지: 안녕하세요! 😊
받은 메시지: 안녕하세요! 😊
보낸 메시지: 파이프 예제입니다.
받은 메시지: 파이프 예제입니다.
보낸 메시지: 마지막 메시지입니다.
받은 메시지: 마지막 메시지입니다.

자바

보낸 메시지: 안녕하세요! 😊
받은 메시지: 안녕하세요! 😊
보낸 메시지: 파이프 예제입니다.
받은 메시지: 파이프 예제입니다.
보낸 메시지: 마지막 메시지입니다.
받은 메시지: 마지막 메시지입니다.

😊 정리

  • 파이프는 데이터를 단방향으로 전달할 때 유용한 도구예요.
  • 파이썬multiprocessing.Pipe를, 자바PipedOutputStreamPipedInputStream을 사용해 간단히 구현 가능.
  • 데이터를 보내는 쪽과 받는 쪽을 명확히 구분해야 한다는 점이 중요해요!

이처럼 IPC는 프로그램 간 협력을 가능하게 해줘요. 어렵지 않죠? 😊

 

2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 소켓

 

[쉬운설명]프로세스 간 통신(IPC)이란? : 소켓

프로세스 간 통신(IPC, Inter-Process Communication)이란?컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주

alswnsghd1234.tistory.com

2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐

 

[쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐

프로세스 간 통신(IPC, Inter-Process Communication)이란?컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주

alswnsghd1234.tistory.com

2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 공유 메모리

 

[쉬운설명]프로세스 간 통신(IPC)이란? : 공유 메모리

프로세스 간 통신(IPC, Inter-Process Communication)이란?컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주

alswnsghd1234.tistory.com

 

반응형
SMALL