일방적 프로세스 간 통신을 간소화 할 수 있도록 명명 된 파이프의 작동 방식을 이해하려고합니다. 데이터를 순환 버퍼에 복사하여 RAM에 저장되어 있다고 생각할 때 약간의 오버 헤드가 예상되므로 파이프가 파일에 쓰는 것보다 훨씬 빠를 것으로 예상했습니다 (RAM은 디스크보다 수십 배 빠릅니다).
대신 명명 된 파이프 (또는 익명 파이프)가 파일과 거의 같은 속도라는 것을 알았습니다. Ubuntu Linux를 실행하는 일반 디스크 드라이브 (솔리드 상태 아님)가있는 3GHz 데스크탑에 있습니다. 다음은 Python의 단순화 된 테스트 프로그램입니다.
import sys
import time
import random
megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))
while True:
before = time.time()
sys.stdout.write(megabyte)
after = time.time()
sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))
배관 /dev/null
:
python test.py > /dev/null
각 메가 바이트 당 2.1 마이크로 초 (일정)를 생성합니다.
파일로 배관 :
python test.py > /tmp/testout.txt
500 마이크로 초에서 930 마이크로 초 사이로 이동합니다 (파일이 커질수록 더 큰 값이 더 일반적으로 나타납니다. 아마도 디스크 공간을 찾고 있음).
그런 다음 명명 된 파이프 :
mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe
640 마이크로 초 (일정한) 및 명명되지 않은 파이프를 생성합니다.
python test.py | cat > /dev/null
또한 650 마이크로 초 (일정)를 산출합니다.
파이프의 속도가 왜 파일의 속도보다 속도와 비슷한 지 설명 할 수 있습니까 /dev/null
? "RAM 기반 버퍼가 아닌 파일 기반 버퍼를 통해 파이프를 실행"하는 스위치가 있고 스위치를 변경할 수 있습니까? 커널 옵션이거나 쉘 변수 일 수 있습니까?
또 다른 해석 : 500은 파이핑 만하고 930은 실제로 쓰기 때문에 디스크 출력이 500에서 930 마이크로 초 사이로 점프한다고 가정합니다. 그런 다음 두 경우 모두 배관의 500 ~ 640은 같습니다. 그러나 이러한 해석에 따라 파이핑과 실제로 디스크에 쓰는 것 사이에 두 가지 요소 만있는 이유는 무엇입니까? RAM 디스크에 관해 이야기하는 웹 사이트는 RAM 디스크가 하드 디스크보다 50-200 배 빠르다고 말합니다.
/dev/null
파일, FIFO, 파이프 등 무엇이든 쓰는 데 실제로 쓰는 것은 실제로 저렴합니다. "많은"처리 노력이 필요하기 때문에 훨씬 비쌉니다.