Brian Kernighan explica neste vídeo a atração inicial do Bell Labs por pequenos idiomas / programas baseados em limitações de memória
Uma máquina grande seria de 64 k bytes - K, não M ou G - e isso significava que qualquer programa individual não podia ser muito grande; portanto, havia uma tendência natural de escrever pequenos programas e, em seguida, o mecanismo de pipe, basicamente, o redirecionamento de saída de entrada tornou possível vincular um programa a outro.
Mas não entendo como isso pode limitar o uso da memória, considerando o fato de que os dados precisam ser armazenados na RAM para serem transmitidos entre os programas.
Da Wikipedia :
Na maioria dos sistemas tipo Unix, todos os processos de um pipeline são iniciados ao mesmo tempo [grifo meu], com seus fluxos conectados adequadamente e gerenciados pelo planejador, juntamente com todos os outros processos em execução na máquina. Um aspecto importante disso, diferenciando os tubos Unix de outras implementações de tubos, é o conceito de buffer: por exemplo, um programa de envio pode produzir 5000 bytes por segundo, e um programa de recebimento pode aceitar apenas 100 bytes por segundo, mas não dados são perdidos. Em vez disso, a saída do programa de envio é mantida no buffer. Quando o programa receptor estiver pronto para ler os dados, o próximo programa no pipeline lerá a partir do buffer. No Linux, o tamanho do buffer é 65536 bytes (64 KB). Um filtro de terceiros de código aberto chamado bfr está disponível para fornecer buffers maiores, se necessário.
Isso me confunde ainda mais, pois isso derrota completamente o objetivo de pequenos programas (embora eles sejam modulares até uma certa escala).
A única coisa que consigo pensar em uma solução para minha primeira pergunta (as limitações de memória são problemáticas dependendo dos dados de tamanho) seria que grandes conjuntos de dados simplesmente não eram computados na época e os pipelines de problemas reais deveriam solucionar o problema. quantidade de memória requerida pelos próprios programas. Mas, dado o texto em negrito na citação da Wikipedia, até isso me confunde: como um programa não é implementado por vez.
Tudo isso faria muito sentido se os arquivos temporários fossem usados, mas entendo que os pipes não gravam no disco (a menos que a troca seja usada).
Exemplo:
sed 'simplesubstitution' file | sort | uniq > file2
Está claro para mim que sed
está lendo o arquivo e cuspindo linha por linha. Mas sort
, como BK afirma no vídeo vinculado, é um ponto final, então todos os dados precisam ser lidos na memória (ou não?), E depois são passados para o uniq
que (na minha opinião) seria um programa em linha de cada vez. Mas entre o primeiro e o segundo canal, todos os dados precisam estar na memória, não?
unless swap is used
swap é sempre utilizado quando não há memória RAM suficiente