O que você vai aprender
Descrever a organização em camadas do subsistema de E/S.
Comparar polling, interrupção e DMA quanto a custo de CPU e latência.
Explicar a estrutura, as funções e os riscos de um device driver.
Justificar a escolha da técnica de E/S conforme o dispositivo e o sistema.
O hardware é lento, caótico e diverso
A CPU executa bilhões de operações por segundo; um disco responde em milissegundos, um teclado em centenas de milissegundos entre teclas. Além disso, cada dispositivo fala um "dialeto" próprio de registradores e comandos. Se cada aplicação tivesse de conhecer cada controladora, programar seria um inferno.
O subsistema de E/S do SO esconde essa diversidade e essa lentidão. Ele oferece uma interface uniforme (open/read/write) e cuida de esperar o hardware sem desperdiçar a CPU. Como ele faz isso — polling, interrupção ou DMA — é o coração desta aula.
O que veremos nesta aula
de E/S→Controladora
(hardware)→Polling ·
Interrupção · DMA→Drivers
Subimos da controladora física até a abstração de arquivo, passando pelas três formas de mover dados e pela peça que conhece cada dispositivo: o driver.
Camadas do subsistema de E/S
Subsistema de E/S. Pilha de camadas do SO que vai da chamada de sistema da aplicação até a controladora, escondendo as diferenças entre dispositivos.
de dispositivo→Driver→Controladora
Como a CPU conversa com a controladora
A CPU acessa os registradores da controladora de dois modos. No I/O mapeado em memória (MMIO), os registradores aparecem como endereços de memória comuns — ler/escrever neles controla o dispositivo. No I/O por portas (x86), instruções especiais (in/out) acessam um espaço de endereçamento separado.
Em ambos, o diálogo é: a CPU escreve um comando no registrador de comando, consulta o registrador de status para saber quando terminou, e troca dados pelo registrador de dados. A pergunta central é: como a CPU descobre que o dispositivo terminou? É aí que entram polling, interrupção e DMA.
As três técnicas lado a lado
| Técnica | Como descobre o fim | Custo de CPU | Bom para |
|---|---|---|---|
| Polling | CPU lê o status em laço | Alto (espera ocupada) | Dispositivos rápidos; baixa latência |
| Interrupção | Dispositivo avisa a CPU | Médio (1 ISR por evento) | Dispositivos lentos/esporádicos |
| DMA | 1 interrupção ao fim do bloco | Baixo (CPU livre durante a transferência) | Alta vazão (disco, rede) |
Passo a passo: uma leitura de disco com DMA
DMA: Direct Memory Access
O preço escondido do polling
O polling parece simples — um laço que lê o status até o dispositivo ficar pronto. O problema é a espera ocupada (busy-wait): a CPU queima ciclos sem fazer nada útil enquanto espera. Para um disco lento, isso desperdiça milhões de ciclos por operação.
A interrupção resolve: o dispositivo avisa quando termina, liberando a CPU para outros processos no meio-tempo. Porém, cada interrupção tem custo (salvar contexto, executar a ISR, restaurar). Em rajadas de eventos muito frequentes — uma placa de rede de 10 Gb/s, por exemplo —, o excesso de interrupções (interrupt storm) pode sufocar a CPU; daí técnicas como coalescência de interrupções e polling adaptativo.
Esperando uma encomenda
Onde cada técnica brilha
| Dispositivo | Técnica recomendada | Por quê |
|---|---|---|
| Teclado | Interrupção | Eventos raros; não vale esperar |
| Sensor a 1 kHz em MCU | Polling/timer | Latência baixa e previsível; sem overhead de ISR |
| SSD NVMe | DMA + interrupção | Alta vazão; CPU livre durante a transferência |
| Rede 10 Gb/s | DMA + polling adaptativo | Evitar tempestade de interrupções |
Anatomia do tratamento de uma interrupção
sinaliza IRQ→CPU salva
contexto→Vetor → ISR
do driver→Trata e
confirma→Restaura e
retorna
Buffering, caching e spooling
Entre a aplicação e o dispositivo, o SO interpõe áreas de memória que melhoram desempenho e desacoplamento:
- Buffering: acumula dados para casar velocidades diferentes (a aplicação produz rápido, o disco grava devagar) e para transferir em blocos maiores e eficientes.
- Caching: mantém na RAM blocos de disco recentes (cache de páginas), evitando reler do dispositivo.
- Spooling: enfileira trabalhos para um dispositivo que não pode ser compartilhado simultaneamente, como a impressora.
Por isso, agrupar E/S em poucas operações grandes (com buffers) é muito mais eficiente que muitas operações pequenas, cada uma com seu custo de syscall e de troca de modo.
Verifique seu entendimento
Por que o DMA reduz o uso da CPU em transferências grandes?
Por que um RTOS às vezes prefere polling
Parece contraintuitivo: interrupção não é sempre melhor que polling? Em sistemas de tempo real, nem sempre. Uma interrupção introduz latência de entrada (tempo até a CPU atender) e, pior, jitter (variação dessa latência), pois pode chegar enquanto outra ISR roda ou enquanto interrupções estão desabilitadas.
Para um laço de controle que lê um sensor a 1 kHz com prazo apertado, fazer polling sincronizado por um timer dá latência fixa e previsível, sem o overhead de salvar/restaurar contexto de cada interrupção. Determinismo, de novo, vencendo a eficiência média.
Confusões frequentes
• Achar que DMA "elimina interrupções" — ele gera uma interrupção ao final, em vez de muitas.
• Confundir polling (CPU pergunta) com interrupção (dispositivo avisa).
• Pensar que interrupção é sempre superior — em tempo real, polling pode dar menor jitter.
• Esquecer que drivers rodam em modo núcleo: um bug derruba o sistema todo.
Como escolher a técnica de E/S
Revele a resposta
Por que drivers são a maior fonte de falhas em kernels monolíticos?
Revisão relâmpago
Para onde isso leva
A E/S costura várias aulas:
- As interrupções retomam o tema da Aula 2 (vetor, ISR) e sustentam a preempção (Aula 5).
- O DMA e o buffering apoiam o swap (Aula 9) e o sistema de arquivos (Aula 11).
- A latência de interrupção é métrica central do tempo real (Aula 12).
- Drivers em modo núcleo ligam-se ao isolamento e segurança (Aula 13).
Resumo da aula
Atividade em grupo · Escolhendo a técnica de E/S
Em trios, decidam polling, interrupção ou DMA para cada dispositivo.
Roteiro
- Considerem: teclado, sensor lido a 1 kHz num microcontrolador, SSD NVMe e placa de rede 10 Gb.
- Para cada um, justifiquem a técnica de transferência mais adequada.
- Avaliem o impacto na latência e no uso de CPU.
- Discutam por que um RTOS pode preferir polling em certos casos.
Mini-quiz · Aula 10
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- A E/S é organizada em camadas para esconder a diversidade de hardware.
- Polling gasta CPU em espera; interrupção avisa o evento; DMA transfere blocos sozinho.
- DMA é essencial para dispositivos de alta vazão como disco e rede.
- Drivers dão interface uniforme, mas, em modo núcleo, são fonte crítica de falhas.
- Buffering, caching e spooling melhoram o desempenho; tempo real às vezes prefere polling.