← Voltar ao Encontro 6
Sistemas Operacionais · ADS23
01 / 14
Encontro 6 de 17

CPU-bound × I/O-bound
e Pipes

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.

ADS23IFCE Campus HorizonteProf. José Stelio Sampaio Bastos Neto
📋 Hoje também é dia de entrega parcial do portfólio — confira o roteiro de laboratório pro checklist de entrega.
↓ role pra avançar · use os pontos à direita pra navegar direto
De onde viemos

PID, estados, hierarquia — hoje, o comportamento de cada processo

Encontro 5

Processos têm estado

Rodando, pronto, bloqueado — e um processo alterna entre eles o tempo todo, decidido pelo SO.

Hoje

Nem todo processo alterna do mesmo jeito

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.

Pergunta pra turma

Por que compactar um arquivo grande deixa a CPU no talo,
enquanto copiar esse mesmo arquivo pro pendrive quase não mexe na CPU?

Os dois processos "trabalham bastante". Só que trabalham de jeitos diferentes.

Conceito-base

Todo processo é uma sequência de surtos de CPU e de E/S

Nenhum processo só calcula ou só espera E/S o tempo inteiro — ele alterna entre os dois. O que muda é a proporção.

CPU-bound

Surtos longos de CPU, poucas pausas de E/S

Compactar um arquivo, calcular hash, renderizar vídeo — o processo raramente para pra esperar disco ou rede.

I/O-bound

Surtos curtos de CPU, muita espera de E/S

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).

A pergunta que sustenta o escalonamento

O escalonador precisa saber lidar com os dois tipos ao mesmo tempo

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.

Boa prática de escalonamento

Favorecer processos I/O-bound com prioridade momentânea — eles usam pouca CPU e devolvem o controle rápido, mantendo o sistema responsivo.

Risco se ignorado

Processos CPU-bound monopolizando a CPU deixam toda a interface do sistema lenta e "travada" pra quem está usando o computador.

Como o SO reparte a CPU

Multiplexação: um núcleo, vários processos, fatias de tempo

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".

Processo A
Processo B
Processo C
Escalonador — decide quem roda em cada fatia de tempo
1 núcleo de CPU

Isso é concorrência na prática: vários processos avançando "juntos", mesmo que só um de verdade use a CPU em cada instante.

O gatilho da troca

Quatro momentos em que o escalonador entra em ação

Reparem: um processo I/O-bound costuma sair da CPU sozinho (item 3) — é por isso que ele "atrapalha" menos o resto do sistema.

Mudando de assunto: como um processo conversa

Todo processo nasce com três "canais" abertos

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.

CanalDescritorUso comum
stdin0Entrada padrão — normalmente o teclado
stdout1Saída padrão — normalmente a tela
stderr2Saí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 poder de encanar processos

Pipe: o stdout de um processo vira o stdin do próximo

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.

ps aux
stdout: lista de processos
→
grep bash
stdin ← stdout anterior
→
wc -l
stdin ← stdout anterior

Vocês já usam pipe desde o Encontro 5 (ps aux | grep) — hoje isso ganha nome e explicação técnica.

Por dentro do encanamento

Cada pedaço do pipeline é, na verdade, um processo próprio

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.

ps aux (processo 1) — gera a lista completa
grep bash (processo 2) — filtra, recebendo do processo 1
wc -l (processo 3) — conta linhas, recebendo do processo 2

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.

Eixo do curso

Ver, ao vivo, o consumo de CPU/memória de um container

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.

top

Vê processos do host inteiro

Inclui o processo do container, mas misturado com todos os outros processos do sistema.

docker stats

Vê só os containers, um por linha

%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.

Prévia da prática

Do processo CPU-bound ao docker stats

Uma 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.

Mão na massa

De observar comportamento a encanar processos

DIAGNÓSTICO

CPU-bound × I/O-bound + pipes

Rodar um processo de cada tipo, observar no top, e encanar comandos com |.

REFORÇO DOCKER

docker stats

Comparar 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.

Para ler

Leitura da semana

🟢

Laureano — Multiplexação do processador + E/S padrão de um processo

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

🔵

Tanenbaum — Escalonamento (recorte introdutório)

Comportamento de processos, surtos de CPU × E/S, e quando o escalonador entra em ação. p. 103–107

⚪

Tanenbaum (completo) + Laureano — Prioridades e Escalonamento no Linux

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.