파이프가 있는 경우:
process1 | process2
프로세스 1은 기가바이트의 데이터를 매우 빠르게 생성하지만 프로세스 2는 해당 데이터를 네트워크를 통해 전송해야 하므로 속도가 훨씬 느립니다. 다음을 수행하세요.
- process1의 실행 속도를 느리게 하시겠습니까? ;또는
- 프로세스 2가 읽을 수 있을 때까지 데이터를 어딘가에 버퍼링하시겠습니까?
데이터가 버퍼링되는 경우 커널에 의해 버퍼링됩니까? 메모리에 있나요, 아니면 디스크에 있나요? 이 버퍼는 얼마나 큽니까? 버퍼가 오버플로되면 어떻게 되나요?
답변1
느린 프로세스는 빠른 프로세스의 속도를 제한합니다. 파이프는 write()
바이트를 버퍼에 넣는 프로세스와 버퍼에서 바이트를 가져오는 프로세스 사이의 버퍼(커널 및 fcntl(2) 작업을 사용하는 프로세스의 조정에 따라 크기가 512~64k 바이트)입니다. 다른 프로세스 간에 바이트를 호출하여 호출로 버퍼링합니다 read()
.
write()
read()
두 가지 모두 커널에 대한 제어권을 호출합니다 . 따라서 읽기 프로세스가 read()
빈 파이프 버퍼를 호출하면 커널은 read()
다른 프로세스가 바이트를 넣을 때까지(또는 표준 출력 파일 설명자를 닫을 때까지) 해당 버퍼에서 반환하지 않습니다. 반면에 쓰기 프로세스가 전체 파이프 버퍼를 호출하는 경우 커널은 다른 프로세스가 바이트를 가져오거나 표준 입력 파일 설명자를 닫을 때까지 write()
버퍼에 새 바이트를 추가하지 않고 버퍼에서 반환됩니다 .write()
따라서 결과적으로 더 빠른 프로세스의 성능은 느린 프로세스의 성능에 의해 제한됩니다. 커널은 파이프 버퍼 오버플로나 언더플로를 허용하지 않습니다.