두 번째 명령이 첫 번째 명령(파이프라인)의 출력을 기다리지 않는 이유는 무엇입니까?

두 번째 명령이 첫 번째 명령(파이프라인)의 출력을 기다리지 않는 이유는 무엇입니까?

저는 현재 M. Bach의 "The Design of the UNIX® Operating System"을 읽고 있습니다.

메인 쉘 루프에 대해 읽었습니다. if (/* piping */)블록을 보세요 . 내가 올바르게 이해했다면 파이프는 첫 번째 명령 출력이 두 번째 명령 입력으로 처리되도록 허용합니다. 그렇다면 두 번째 명령이 첫 번째 명령이 종료될 때까지 기다리도록 하는 코드가 없는 이유는 무엇입니까? 이 명령이 없으면 파이핑은 무의미해 보입니다. 두 번째 명령은 입력이 준비되지 않은 상태에서 실행을 시작할 수 있습니다.

메인 쉘 루프

답변1

두 번째 명령은 입력이 준비되지 않은 상태에서 실행을 시작할 수 있습니다.

물론. 아무 문제가 없습니다.

파이프라인에서는 producer | consumer양쪽이 동시에 실행됩니다. 소비자는 생산자가 작업을 완료할 때까지 기다리지 않습니다. 프로듀서가 시작했더라도 상관없어요. 소비자가 필요로 하는 모든 것은 입력 내용을 읽을 수 있는 장소입니다. 호출이 파이프를 생성하면 이 장소가 존재합니다 pipe.

파이프에서 읽는 것은차단하다작업. 데이터가 아직 파이프에 기록되지 않은 경우 판독기가 차단됩니다. 데이터가 파이프에 기록되면 판독기의 차단이 해제됩니다. 보다 일반적으로, 파이프에 데이터가 없으면 판독기가 차단됩니다. 파이프에서 데이터를 읽으면 해당 데이터가 소비됩니다. 따라서 소비자가 읽기 시작하면 생산자가 이미 쓰기 시작했는지 여부는 중요하지 않습니다. 소비자는 생산자가 일부 데이터를 쓸 때까지 기다립니다.

소비자는 데이터가 제공되는 즉시 데이터를 받습니다. ²일반적으로 데이터를 청크로 읽고 처리합니다. 대부분의 소비자는 처리를 시작하기 전에 모든 데이터를 보유할 필요가 없습니다. 소비자가 사용 가능한 모든 데이터가 필요한 경우 이를 메모리나 임시 파일에 저장하고 입력이 완료될 때까지 기다립니다.

생산자와 소비자는 독립적인 프로세스이므로 동시에 실행됩니다. 하나가 실행 중이라고 해서 다른 하나가 실행되는 것을 막지는 않습니다. 생산자와 소비자 모두 CPU 시간이 필요한 경우 커널은 둘 사이(및 CPU 시간이 필요한 다른 프로세스 사이)에서 CPU를 공유합니다. 따라서 소비자가 일부 데이터를 초기화하거나 처리하는 경우에도 생산자는 더 많은 데이터를 실행하고 생성할 수 있습니다.

1 병렬로 실행된다고 말할 수 있습니다. 이는 기술적으로 정확하지는 않지만 충분히 가깝습니다.
² 실제로 생산자는 다음을 수행할 수 있습니다.완충기내부 데이터. 그러나 생산자가 실제로 데이터를 파이프에 쓰면 소비자는 이를 읽을 수 있습니다.

관련 정보