스트림 처리 및 대기열에는 다음 개념이 있습니다.배압즉, 생산자 프로세스가 소비자 프로세스보다 빠른 경우 사용 가능한 메모리/저장소를 초과하지 않도록 생산자의 속도를 늦추는 메커니즘이 있어야 합니다(허용되거나 허용되지 않는 메시지 삭제 없이).
foo
나는 이제 stdio가 이런 의미에서(예를 들어 에서 ) 생산자 Unix 프로세스에 역압을 가하는 데 사용될 수 있는지 궁금합니다 foo | bar
. 버퍼가 용량에 도달했을 때 stdout에 대한 쓰기가 차단되더라도 생산자 프로세스가 올바른 작업(TM)을 수행하고 stdout에 기록되기를 기다리는 메모리에 데이터를 축적하지 않는 것이 여전히 필요한 것 같습니다. 단일 스레드 차단 프로그램은 테스트를 통과한 것처럼 보이지만 비동기 프로그램에는 쓰기 대기 중인 데이터가 너무 많아지는 것을 방지하기 위해 자체적인 내부 버퍼링 및 배압 메커니즘이 있어야 할 수도 있습니다.
그렇다면 이것이 어느 정도까지 가능합니까? 구체적인 상황은 어떤가요?
답변1
파이프의 버퍼 크기는 제한되어 있습니다. 생산자가 소비자보다 앞서면 데이터가 점차적으로 파이프의 버퍼를 채웁니다. 버퍼가 가득 차면 write
공간이 생길 때까지 생산자의 호출이 차단됩니다. 따라서 배압이 시스템에 내장되어 있습니다.
버퍼 크기는 POSIX 호환 시스템에서 최소 512바이트이며 일반적으로 최신 unice에서 더 크며 구성 가능합니다. 바라보다파이프 버퍼는 얼마나 큽니까?자세한 내용은.