명명된 파이프
1. 개요
명명된 파이프는 프로세스 간 통신(IPC)을 위한 기술로, 유닉스 계열 및 윈도우 운영 체제에서 모두 지원된다. 유닉스 계열에서는 파일 시스템을 사용하여 생성되며, `mkfifo` 또는 `mknod` 명령어를 통해 생성, 삭제 및 사용된다. 윈도우에서는 `CreateFile`, `ReadFile`, `WriteFile` 등을 사용하여 파이프를 관리하며, `\\.\pipe\` 경로에 위치한다. 명명된 파이프는 데이터 압축, 데이터 로딩, 디버깅, 네트워킹 프로토콜 등 다양한 분야에서 활용되며, .NET Framework 및 Microsoft SQL Server에서도 지원된다.
-
프로세스 간 통신 -
Ajax
Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다. -
프로세스 간 통신 -
D-Bus
D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다.
2. 유닉스 계열
유닉스 계열 운영체제에서 명명된 파이프는 파일 시스템을 사용하며, `mkfifo` 또는 `mknod` 명령어를 사용하여 명시적으로 생성된다. 두 개의 별도 프로세스는 이름을 통해 파이프에 접근할 수 있는데, 한 프로세스는 읽는 쪽(reader)으로, 다른 프로세스는 쓰는 쪽(writer)으로 연다.
2.1. 생성 및 사용
명명된 파이프는 보통 셸에서 사용하는 이름 없는 파이프와 달리 파일 시스템을 사용한다. `mkfifo` 또는 `mknod` 명령어를 사용하여 명시적으로 만들어진다. 두 개의 별도 프로세스는 이름을 지정하여 그 파이프에 접근할 수 있다. 하나의 프로세스는 독자(reader)로 열고, 다른 하나는 작가(writer)로 연다.
예를 들어, 명명된 파이프를 만들고 파이프에 입력된 것을 gzip으로 압축하는 경우 다음과 같이 할 수 있다.
```bash
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz &
```
별개의 프로세스 셸에서는, 이와는 완전히 독립적으로 압축할 데이터를 보낼 수도 있다.
```bash
cat file > my_pipe
```
명명된 파이프는 일반 파일처럼 삭제할 수 있다.
```bash
rm my_pipe
```
명명된 파이프는 임시 파일을 만들지 않고도 하나의 응용 프로그램에서 다른 응용 프로그램으로 정보를 전달할 수 있게 해준다. 예를 들어, gzip의 압축 해제된 출력을 다음과 같이 명명된 파이프에 연결한다.
```bash
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
```
그리고 압축이 풀린 데이터를 다음과 같이 MySQL의 테이블에 로드한다.
```sql
LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
```
명명된 파이프가 없으면 file.gz을 압축 해제한 것을 일단 임시 파일에 저장해야 MySQL에 로드할 수 있다. 임시 파일에 기록하면 I/O가 더 많이 발생하여, 시간도 오래 걸리고 하드 디스크 공간도 더 필요하게 된다.
PostgreSQL 명령줄 형 프런트 엔드 psql도 명명된 파이프에서 데이터를 로드하는 기능을 갖추고 있다.
2.2. 활용 예시
명명된 파이프는 임시 파일을 생성하지 않고도 한 응용 프로그램에서 다른 응용 프로그램으로 정보를 전달하는 데 사용될 수 있다.
`gzip` 압축 및 해제와 관련하여, 명명된 파이프를 생성하고 여기에 입력된 내용을 `gzip`으로 압축하는 예시는 다음과 같다.
```bash
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz &
```
별개의 프로세스 셸에서는 압축할 데이터를 다음과 같이 독립적으로 보낼 수 있다.
```bash
cat file > my_pipe
```
`gzip`의 압축 해제된 출력을 명명된 파이프에 연결하는 예시는 다음과 같다.
```bash
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
```
MySQL, PostgreSQL과 같은 데이터베이스 시스템에서 명명된 파이프를 활용하여 데이터를 로드할 수 있다. `MySQL` 테이블에 압축 해제된 데이터를 로드하는 예시는 다음과 같다.
```sql
LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
```
명명된 파이프가 없으면 `file.gz` 압축 해제 데이터를 임시 파일에 저장해야 하므로, I/O 발생이 많아져 시간과 하드 디스크 공간을 더 필요로 하게 된다.
3. 윈도우
윈도우 운영체제에서 명명된 파이프는 클라이언트-서버 모델을 기반으로 설계되었으며, 유닉스 계열과는 다른 특징을 가진다.
Win32 SDK 함수인 `CreateFile`, `ReadFile`, `WriteFile`, `CloseHandle`을 사용하여 파이프를 열고, 읽고, 쓰고, 닫을 수 있다. 유닉스와 달리 PowerShell을 제외하고는 명령 줄 인터페이스는 없다.
윈도우 명명된 파이프는 일반 파일 시스템 내에서 파일로 생성될 수 없으며, 휘발성을 가져 마지막 참조가 닫히면 제거된다. 모든 파이프는 `\\.\pipe\` 경로에 마운트된 명명된 파이프 파일 시스템(NPFS)의 루트 디렉토리에 배치된다. 예를 들어, "foo"라는 이름의 파이프는 `\\.\pipe\foo`라는 전체 경로 이름을 갖는다. 파이프라인에 사용되는 익명 파이프는 실제로 임의의 이름을 가진 명명된 파이프이다.
Windows 95는 명명된 파이프의 클라이언트를 지원하며, Windows NT 계열 운영체제에서는 클라이언트와 서버를 모두 지원한다.
3.1. 특징
명명된 파이프는 `\\.\pipe\` 경로에 마운트된 명명된 파이프 파일 시스템(NPFS)의 루트 디렉터리에 특수한 파일 형태로 생성된다. "foo"라는 이름의 파이프는 `\\.\pipe\foo`라는 전체 경로 이름을 갖는다.
다음은 명명된 파이프의 주요 특징이다.
3.2. 활용 예시
VMware Workstation은 에뮬레이션된 직렬 포트를 호스트 시스템에 명명된 파이프로 노출할 수 있다. 마이크로소프트의 WinDbg는 디버깅 세션의 전송 수단으로 명명된 파이프를 지원한다. VMware와 WinDbg를 함께 사용하면, 드라이버 개발자가 단일 컴퓨터에서 개발 및 테스트를 수행할 수 있다. 두 프로그램 모두 사용자에게 `\\.\pipe\name` 형식으로 이름을 입력하도록 요구한다.
.NET Framework 3.5는 명명된 파이프 지원을 추가했다.
마이크로소프트 SQL 서버는 클라이언트와의 연결에 명명된 파이프를 사용할 수 있다.
서버 메시지 블록(SMB)은 특수 프로세스 간 통신(IPC) 공유를 사용하는 네트워킹 프로토콜이며, SMB의 IPC는 사용자의 인증 컨텍스트를 명명된 파이프로 원활하고 투명하게 전달할 수 있다.