파일 대신 명명 된 파이프를 사용하는 이유는 무엇입니까?


42

최근에 명명 된 파이프에 대해 읽었는데 왜 존재하는지 이해할 수 없었습니다.
명명 된 파이프를 사용하는 것이 파일을 사용하는 것보다 시간이 덜 걸리는 곳을 읽었습니다.

왜 그렇습니까?
명명 된 파이프도 메모리에 저장해야합니다 (파일과 마찬가지로 교체 될 수도 있음).
내가 볼 수있는 한, 그들은 파일과 마찬가지로 현재 디렉토리에서 참조 해야하는 inode를 가져와야합니다. 또한 파일과 마찬가지로 프로그래머가 제거해야합니다.

그렇다면 이점은 어디에 있습니까?


이것은 교실 과제의 일부가 아닙니다. 그렇지 않습니까?
don.joey

6
아니요 ... 실제로이 질문을 발견했을 때 강의 노트를 살펴 보았는데 대답을 할 수 없었습니다 ... 과제가 된 경우 그것이 어떻게 관련이 있는지 알지 못합니다 ... 답을 찾을 때까지 답을 찾지
못했습니다.

답변:


41

리눅스에서 거의 모든 것이 파일 로 간주 될 수 있지만, 일반 파일명명 된 파이프 의 주요 차이점은 명명 된 파이프는 파일 시스템에 내용이없는 파일의 특별한 인스턴스라는 것입니다.

인용은 다음과 같습니다 man fifo.

FIFO 특수 파일 (명명 된 파이프)은 파일 시스템의 일부로 액세스된다는 점을 제외하면 파이프와 유사합니다. 읽기 또는 쓰기를 위해 여러 프로세스에서 열 수 있습니다. 프로세스가 FIFO를 통해 데이터를 교환 할 때 커널은 모든 데이터를 파일 시스템에 쓰지 않고 내부적으로 전달합니다. 따라서 FIFO 특수 파일에는 파일 시스템에 내용이 없습니다. 파일 시스템 항목은 프로세스가 파일 시스템의 이름을 사용하여 파이프에 액세스 할 수 있도록 단지 참조 점 역할을합니다.

커널은 최소한 하나의 프로세스에서 열린 각 FIFO 특수 파일에 대해 정확히 하나의 파이프 객체를 유지 관리합니다. FIFO는 데이터를 전달하기 전에 양쪽 끝 (읽기 및 쓰기)에서 열어야합니다. 일반적으로 다른 쪽 끝도 열릴 때까지 FIFO 블록을 엽니 다.

따라서 실제로 명명 된 파이프는 일부 프로세스가 읽고 쓸 때까지 아무것도하지 않습니다. 약간의 메타 정보를 제외하고 하드 디스크의 공간을 차지하지 않으며 CPU를 사용하지 않습니다.

다음을 수행하여 확인할 수 있습니다.

명명 된 파이프 만들기

$ mkfifo /tmp/testpipe

예를 들어 일부 디렉토리로 이동 /home/user/Documents하여 명명 된 파이프를 사용하여 그 안에있는 모든 것을 압축하십시오.

$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584

여기 gzip 프로세스의 PID가 표시됩니다. 이 예에서는 28584입니다.

이제이 PID가 무엇을하고 있는지 확인하십시오.

$ ps u -P 28584
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
c0rp     28584  0.0  0.0  29276  7800 pts/8    S    00:08   0:00 bash

자원 이 사용 되지 않음을 알 수 있습니다 . CPU 사용량 0 %, 메모리 사용량 0 %

파일 공간 사용에 대한 직감 확인

$ du -h /tmp/testpipe
0   testpipe

그리고 다시 0, 아무것도. 필요한 경우 테스트 파이프를 다시 사용할 수 있습니다.

를 사용하여 gzip을 죽이는 것을 잊지 마십시오 kill -15 28584. 그리고 명명 된 파이프를 사용하여 제거하십시오rm /tmp/testpipe

사용법 예

명명 된 파이프를 사용하여 거의 모든 것을 리디렉션 할 수 있습니다. 예를 들어이 한 줄 프록시를 볼 수 있습니다 .

또한 여기에 하나 더 명명 된 파이프 사용의 좋은 설명. TCP / IP 스택 대신 명명 된 파이프를 사용하여 통신하도록 한 서버에서 두 개의 프로세스를 구성 할 수 있습니다. 훨씬 빠르며 네트워크 리소스를로드하지 않습니다. 예를 들어, 웹 서버는 localhost주소 를 사용 하거나 일부 포트를 수신하는 대신 명명 된 파이프를 사용하여 데이터베이스와 직접 통신 할 수 있습니다 .


14

시스템 메모리를 사용하지 않지만 예제에서 CPU를 사용하지 않는다는 것은 파이프를 읽지 않아 프로세스가 대기 중이기 때문입니다.

다음 예제를 고려하십시오.

mkfifo /tmp/testpipe
tar cvf - / | gzip > /tmp/testpipe

이제 새 콘솔을 열고 다음을 실행하십시오.

watch -n 1 'ps u -P $(pidof tar)

그리고 세 번째 콘솔에서 :

cat /tmp/testpipe > /dev/null

watch cmd (2 번째 용어)를 보면 CPU 소비가 증가한 것으로 나타납니다!


1
이 답변에 관한 것입니다 c0rp의 대답
wjandrea

2

명명 된 파이프가 I / O를 제거하여 많은 시간을 절약 할 수있는 유스 케이스 입니다.

BigFile (예 : 10G)이 있다고 가정 해 봅시다.

이 BigFile을 1G, BigFileSplit_01에서 BigFile_Split_10 조각으로 분할했습니다.

이제 BigFileSplit_05의 정확성에 의문이 생겼습니다.

이름이 붙은 파이프가 없다면 순진하게 BigFile에서 새로운 분할을 만들고 다음을 비교합니다.

dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

명명 된 파이프를 사용하면

mkfifo BigFileSplitOrig_05
dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1 &
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

그것은 첫눈에 큰 차이로 보이지 않을 수도 있지만 ... 시간이 지나면 그 차이는 엄청납니다!

옵션 1:

  • dd : 1G 읽기 / 1G 쓰기 (1)
  • diff : 2G 읽기
  • rm : 할당 된 클러스터 해제 / 디렉토리 항목 제거

옵션 2 :

  • dd : 아무것도! (명명 된 파이프로 이동)
  • diff : 2G 읽기
  • rm : 관리 할 할당 된 클러스터가 없습니다 (실제로는 파일 시스템에 아무것도 쓰지 않았습니다) / 디렉토리 항목 제거

따라서 기본적으로 명명 된 파이프는 1G의 읽기 및 쓰기와 일부 파일 시스템 정리를 저장합니다 (파일 시스템에 아무것도 기록하지 않았기 때문에 빈 fifo 노드).

I / O, 특히 쓰기를하지 않으면 디스크의 마모를 피하는 것이 좋습니다. 셀이 죽기 전에 쓰기 수가 제한되어 있기 때문에 SSD로 작업 할 때 더욱 흥미 롭습니다.

(1) 분명히, 또 다른 옵션은 임시 파일을 RAM에 작성하는 것입니다 (예 : / tmp가 RAM (tmpfs)에 마운트 된 경우). 그럼에도 불구하고 RAM 디스크의 크기에 의해 제한을받는 반면 "명명 된 파이프 트릭"에는 제한이 없습니다.


0

프로그램이 여전히 놓여 있고 외부 이벤트에 대해 명명 된 파이프를들을 수 있습니다. 외부 이벤트가 발생하자마자 (일부 새로운 데이터의 도착) 이것은 다른 프로그램에 의해 감지 될 수 있습니다.이 프로그램은 파이프에 쓰기 위해 파이프를 열고 관련 이벤트 데이터를 파이프에 씁니다. close 문이 발행되면, 청취 프로그램은 read 문을 통해 파이프를 통해 데이터 스트림을 수신하고, 그 내용을 처리 할 준비가됩니다. 내용을 읽은 후 파이프를 닫는 것을 잊지 마십시오. 청취 프로그램은 동일한 또는 다른 명명 된 파이프를 통해 처리 결과를 리턴 할 수도 있습니다. 이러한 프로그램 간 통신은 때때로 매우 편리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.