Pipeline sendo executado em paralelo através da criação de múltiplos subshells

0

Eu li a partir desta resposta sobre a distinção entre | e ; link ;

Consider two commands A and B. When you write

A | B
A and B are executed in parallel, and the standard output of A is sent as the standard input of B.

Estou confuso sobre a palavra parallel

Eu poderia entender a descrição de Pipeline (Unix) - Wikipedia

Unix-like computer operating systems, a pipeline is a sequence of processes chained together by their standard streams, so that the output of each process (stdout) feeds directly as input (stdin) to the next one.

Pipeline está passando a saída para a próxima como entrada.

No entanto, a resposta é "paralela", eles estão sendo executados simultaneamente em vez de em seqüência.

Como esse mecanismo funciona?

Eu acho que | deve gerar um subshell que obtenha uma variável de A no shell pai (exporte a variável) e então as subshells serão fechadas automaticamente quando as tarefas terminarem.

    
por JawSaw 31.10.2018 / 11:08

1 resposta

0

Os pipelines são um exemplo de processamento de fluxo. Depois que um pipeline é construído, o processamento participa de vários processos ao mesmo tempo - assim que os dados chegam a todos os processos. Imagine isto - existem três partes de dados - a b c e dois processos - A e B . Agora observe estas etapas:

  1. a@A B - a insere A , não há nada em B ainda

  2. b@A a@B - a é passado para B e b insere A

  3. c@A b@B - c chega a A , enquanto b alcança B

  4. A c@B - nada mais em A e c em B

Imagine a , b e c são muito grandes. Tão grande apenas dois elementos podem estar presentes na máquina ao mesmo tempo. O processamento seqüencial exige processá-las primeiro em A e, em seguida, em B e armazená-las todas ao mesmo tempo. O processamento paralelo significa não apenas menores demandas de armazenamento, mas também envolve vários processadores - embora não necessariamente, já que o paralelismo pode ser simulado em um único processador pela alocação de tempo.

Cada etapa de um pipeline é um processo separado em execução em um subshell. Geralmente, há buffering na saída em processos específicos, o que significa que a saída é enviada em partes maiores. Isso otimiza as operações, mas pode ser desativado e, em seguida, a saída sai assim que estiver pronta. Mas mesmo com pedaços maiores ainda é paralelo.

    
por 31.10.2018 / 11:30