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