Docker
파이프(pipe) ( | )
by xogns93
2024. 12. 5.
파이프 기반 통신 (Pipe-based Communication)
파이프(pipe)는 두 개 이상의 프로세스 간에 데이터를 직렬화된 방식으로 전달할 수 있도록 하는 프로세스 간 통신(IPC, Inter-Process Communication) 방법입니다. 주로 Linux/Unix 기반 운영 체제에서 사용되며, 프로세스 간 데이터를 주고받는 데 간단하고 효율적인 방법을 제공합니다.
파이프의 특징
- 직렬화된 데이터 흐름:
- 데이터를 순차적으로 읽고 쓸 수 있습니다. 한쪽에서 데이터를 쓰면 다른 쪽에서 읽습니다.
- 일방향 통신:
- 기본적으로 한 방향으로만 데이터가 흐릅니다. (읽기 또는 쓰기)
- 양방향 통신이 필요한 경우에는 두 개의 파이프가 필요합니다.
- 익명 파이프:
- 부모 프로세스와 자식 프로세스 간에만 사용할 수 있습니다.
- 이름 있는 파이프(Named Pipe, FIFO):
- 서로 관련 없는 프로세스 간에도 통신할 수 있습니다. 파일 시스템에서 이름이 지정된 파이프를 통해 데이터를 주고받습니다.
- 순차적 접근:
- 데이터는 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
파이프의 주요 사용 예
- 명령어 연결:
- 프로그램 간 통신:
- 하나의 프로그램에서 데이터를 생성하고 다른 프로그램에서 처리.
- 프로세스 간 데이터 교환:
- 두 개의 독립된 프로세스가 데이터를 주고받는 데 사용.
파이프의 동작 원리
- 쓰기(write):
- 읽기(read):
- 블로킹 I/O:
- 데이터를 쓸 때, 읽는 쪽에서 데이터를 가져가지 않으면 쓰는 쪽은 대기 상태에 들어갑니다.
- 데이터를 읽을 때도 마찬가지로, 데이터가 없으면 읽는 쪽은 대기 상태에 들어갑니다.
파이프 기반 통신의 장점
- 간단한 구현:
- 효율적인 데이터 처리:
- OS 기본 지원:
- 대부분의 운영 체제에서 기본적으로 지원됩니다.
파이프 기반 통신의 단점
- 일방향 제한:
- 기본적으로 한쪽에서 쓰고, 다른 쪽에서 읽기만 가능합니다.
- 양방향 통신이 필요한 경우 복잡성이 증가합니다.
- 공유 메모리보다 느림:
- 데이터를 메모리에서 직접 공유하지 않고, 파이프를 통해 전달하므로 속도가 느립니다.
- 파일 기반 FIFO의 디스크 I/O:
- 이름 있는 파이프(FIFO)는 파일 시스템에 의존하므로 추가적인 디스크 I/O가 발생할 수 있습니다.
파이프와 다른 IPC 방식 비교
특징 |
파이프(Pipe) |
소켓(Socket) |
공유 메모리(Shared Memory) |
통신 범위 |
동일 시스템 (FIFO는 다름) |
네트워크 또는 로컬 |
동일 시스템 |
속도 |
보통 |
중간 |
빠름 |
복잡성 |
낮음 |
높음 |
중간 |
데이터 보관성 |
없음 (스트림) |
스트림 또는 메시지 기반 |
지속성 없음 |
양방향 통신 |
별도 구현 필요 |
지원 |
별도 동기화 필요 |
파이프의 현대적 사용
- 오늘날 파이프 기반 통신은 여전히 유용하며, 쉘 스크립트나 간단한 프로세스 간 통신에서 널리 사용됩니다.
- Docker, Kubernetes 등에서 로그 처리, 명령 전달, 데이터 스트림 처리에 종종 활용됩니다.