본문 바로가기
Docker

파이프(pipe) ( | )

by xogns93 2024. 12. 5.

파이프 기반 통신 (Pipe-based Communication)

파이프(pipe)는 두 개 이상의 프로세스 간에 데이터를 직렬화된 방식으로 전달할 수 있도록 하는 프로세스 간 통신(IPC, Inter-Process Communication) 방법입니다. 주로 Linux/Unix 기반 운영 체제에서 사용되며, 프로세스 간 데이터를 주고받는 데 간단하고 효율적인 방법을 제공합니다.


파이프의 특징

  1. 직렬화된 데이터 흐름:
    • 데이터를 순차적으로 읽고 쓸 수 있습니다. 한쪽에서 데이터를 쓰면 다른 쪽에서 읽습니다.
  2. 일방향 통신:
    • 기본적으로 한 방향으로만 데이터가 흐릅니다. (읽기 또는 쓰기)
    • 양방향 통신이 필요한 경우에는 두 개의 파이프가 필요합니다.
  3. 익명 파이프:
    • 부모 프로세스와 자식 프로세스 간에만 사용할 수 있습니다.
  4. 이름 있는 파이프(Named Pipe, FIFO):
    • 서로 관련 없는 프로세스 간에도 통신할 수 있습니다. 파일 시스템에서 이름이 지정된 파이프를 통해 데이터를 주고받습니다.
  5. 순차적 접근:
    • 데이터는 FIFO(First In, First Out) 방식으로 처리됩니다.

파이프의 종류

1. 익명 파이프 (Anonymous Pipe)

  • 부모-자식 프로세스 간의 데이터 교환에 주로 사용됩니다.
  • 파일 시스템에 저장되지 않고, 메모리를 통해 처리됩니다.
  • 프로세스를 종료하면 파이프도 사라집니다.
  • 예:*
  • $ ls | grep ".txt"
  • ls 명령어의 출력이 grep 명령어의 입력으로 전달됩니다.

2. 이름 있는 파이프 (Named Pipe, FIFO)

  • 파일 시스템에 파일 형태로 존재하며, 관련 없는 프로세스 간 통신을 지원합니다.
  • 한 프로세스가 데이터를 쓰고, 다른 프로세스가 데이터를 읽습니다.
  • 데이터를 읽은 후 파이프는 비워집니다.
  • 예:*
  • # 이름 있는 파이프 생성 $ mkfifo mypipe # 한 프로세스에서 쓰기 $ echo "Hello World" > mypipe # 다른 프로세스에서 읽기 $ cat < mypipe

파이프의 주요 사용 예

  1. 명령어 연결:
    • 쉘 스크립트에서 파이프(|)를 사용하여 여러 명령어를 연결합니다.
    • 예:
      $ ps aux | grep apache | awk '{print $2}'
      • ps aux의 출력 결과를 grep으로 필터링하고, 그 결과를 awk로 처리.
  2. 프로그램 간 통신:
    • 하나의 프로그램에서 데이터를 생성하고 다른 프로그램에서 처리.
  3. 프로세스 간 데이터 교환:
    • 두 개의 독립된 프로세스가 데이터를 주고받는 데 사용.

파이프의 동작 원리

  1. 쓰기(write):
    • 파이프의 한쪽 끝에서 데이터를 씁니다.
  2. 읽기(read):
    • 파이프의 다른 쪽 끝에서 데이터를 읽습니다.
  3. 블로킹 I/O:
    • 데이터를 쓸 때, 읽는 쪽에서 데이터를 가져가지 않으면 쓰는 쪽은 대기 상태에 들어갑니다.
    • 데이터를 읽을 때도 마찬가지로, 데이터가 없으면 읽는 쪽은 대기 상태에 들어갑니다.

파이프 기반 통신의 장점

  1. 간단한 구현:
    • 명령어 하나로 데이터 전달이 가능합니다.
  2. 효율적인 데이터 처리:
    • 데이터 스트림을 처리하는 데 적합합니다.
  3. OS 기본 지원:
    • 대부분의 운영 체제에서 기본적으로 지원됩니다.

파이프 기반 통신의 단점

  1. 일방향 제한:
    • 기본적으로 한쪽에서 쓰고, 다른 쪽에서 읽기만 가능합니다.
    • 양방향 통신이 필요한 경우 복잡성이 증가합니다.
  2. 공유 메모리보다 느림:
    • 데이터를 메모리에서 직접 공유하지 않고, 파이프를 통해 전달하므로 속도가 느립니다.
  3. 파일 기반 FIFO의 디스크 I/O:
    • 이름 있는 파이프(FIFO)는 파일 시스템에 의존하므로 추가적인 디스크 I/O가 발생할 수 있습니다.

파이프와 다른 IPC 방식 비교

특징 파이프(Pipe) 소켓(Socket) 공유 메모리(Shared Memory)
통신 범위 동일 시스템 (FIFO는 다름) 네트워크 또는 로컬 동일 시스템
속도 보통 중간 빠름
복잡성 낮음 높음 중간
데이터 보관성 없음 (스트림) 스트림 또는 메시지 기반 지속성 없음
양방향 통신 별도 구현 필요 지원 별도 동기화 필요

파이프의 현대적 사용

  • 오늘날 파이프 기반 통신은 여전히 유용하며, 쉘 스크립트나 간단한 프로세스 간 통신에서 널리 사용됩니다.
  • Docker, Kubernetes 등에서 로그 처리, 명령 전달, 데이터 스트림 처리에 종종 활용됩니다.

'Docker' 카테고리의 다른 글

유니온 파일시스템  (1) 2024.12.06
Docker의 CMD와 ENTRYPOINT  (0) 2024.12.06
CFS(Completely Fair Scheduler)  (0) 2024.12.05
클러스터(cluster)  (0) 2024.12.05
쿠버네티스(Kubernetes)  (0) 2024.12.05