Por que dois processos "pesados" podem consumir a máquina de formas completamente diferentes — e como encanar a saída de um processo direto pra entrada de outro.
Rodando, pronto, bloqueado — e um processo alterna entre eles o tempo todo, decidido pelo SO.
Alguns processos ficam quase sempre rodando. Outros passam a maior parte do tempo bloqueados. Essa diferença tem nome.
E, no fim da aula, vocês vão conectar processos entre si com pipes — a mesma sintaxe | que já usam desde o Encontro 5, agora explicada por dentro.
Os dois processos "trabalham bastante". Só que trabalham de jeitos diferentes.
Nenhum processo só calcula ou só espera E/S o tempo inteiro — ele alterna entre os dois. O que muda é a proporção.
Compactar um arquivo, calcular hash, renderizar vídeo — o processo raramente para pra esperar disco ou rede.
Copiar um arquivo, baixar algo da rede, ler um banco de dados — a CPU faz pouco, a maior parte do tempo é esperando o disco/rede responder.
É exatamente por isso que compactar "trava" a CPU (ela fica no estado rodando quase sempre), enquanto copiar deixa a CPU ociosa boa parte do tempo (o processo fica bloqueado, esperando o disco).
Se o SO desse a CPU só pra processos CPU-bound até eles terminarem, todo processo I/O-bound (como digitar num editor de texto) pareceria travado — inaceitável pra qualquer usuário.
Favorecer processos I/O-bound com prioridade momentânea — eles usam pouca CPU e devolvem o controle rápido, mantendo o sistema responsivo.
Processos CPU-bound monopolizando a CPU deixam toda a interface do sistema lenta e "travada" pra quem está usando o computador.
Com um número limitado de núcleos e dezenas (às vezes centenas) de processos, o SO reparte a CPU em fatias de tempo curtíssimas — trocando de processo tão rápido que, pra nós, parece que tudo roda "ao mesmo tempo".
Isso é concorrência na prática: vários processos avançando "juntos", mesmo que só um de verdade use a CPU em cada instante.
Reparem: um processo I/O-bound costuma sair da CPU sozinho (item 3) — é por isso que ele "atrapalha" menos o resto do sistema.
Antes de conectar processos entre si, é preciso entender que todo processo já nasce com três fluxos de E/S padrão, numerados pelo Linux.
| Canal | Descritor | Uso comum |
|---|---|---|
| stdin | 0 | Entrada padrão — normalmente o teclado |
| stdout | 1 | Saída padrão — normalmente a tela |
| stderr | 2 | Saída de erro — também a tela, mas separada da saída normal |
Separar stdout de stderr é o motivo de comando 2> erros.txt só capturar os erros, deixando a saída normal na tela.
O caractere | pega a saída padrão (stdout) de um comando e conecta direto na entrada padrão (stdin) do próximo — sem passar por nenhum arquivo intermediário.
Vocês já usam pipe desde o Encontro 5 (ps aux | grep) — hoje isso ganha nome e explicação técnica.
Quando vocês rodam ps aux | grep bash | wc -l, o shell cria três processos ao mesmo tempo, já conectados: o stdout do primeiro alimenta o stdin do segundo, e assim por diante.
Isso também explica por que ps aux | grep bash sempre mostra uma linha "a mais": o próprio grep é um processo novo, e ele aparece procurando por si mesmo.
Assim como o top mostra consumo de processos comuns, o Docker tem sua própria ferramenta pra ver o consumo de containers em tempo real.
topInclui o processo do container, mas misturado com todos os outros processos do sistema.
docker stats%CPU, uso de memória (e limite), E/S de rede e disco — organizados por container, atualizando ao vivo.
Vocês vão usar isso na prática de hoje pra comparar visualmente um container CPU-bound com um container quase ocioso.
docker statsUma sequência real: um processo consumindo CPU no talo, um pipe contando processos, e o consumo de um container ao vivo.
Cada uma dessas linhas vira um passo do roteiro de laboratório de hoje.
Rodar um processo de cada tipo, observar no top, e encanar comandos com |.
docker statsComparar visualmente o consumo de dois containers diferentes, ao vivo.
O roteiro de laboratório detalha os passos, com dicas se algo travar — e inclui o checklist de entrega do portfólio parcial de hoje.
A base teórica de hoje: como a CPU é repartida, e os três canais de E/S de todo processo. p. 106–108 e 120–126
Comportamento de processos, surtos de CPU × E/S, e quando o escalonador entra em ação. p. 103–107
Pra quem quer se aprofundar além do que cai no quiz. p. 103–115 e 127–132
O quiz da semana verifica essa leitura e recolhe suas observações da prática — tudo no mesmo instrumento.