LRM Prof. Mantovani ← Aulas da disciplina
Semana 13 · Aula 13 de 14

U9 · Gerência de dispositivos e virtualização

O subsistema de entrada e saída, a estrutura de um driver e as técnicas de transferência, mais virtualização e contêineres — com aprofundamento em sistemas de tempo real.

📚 Sistemas Operacionais🧪 1 simulador(es)📝 mini-quiz ao final
Objetivos da aula

O que você vai aprender

1

Descrever a organização em camadas do subsistema de E/S.

2

Comparar polling, interrupção e DMA quanto a custo de CPU e latência.

3

Explicar a estrutura, as funções e os riscos de um device driver.

4

Justificar a escolha da técnica de E/S conforme o dispositivo e o sistema.

5

Comparar máquinas virtuais e contêineres quanto a isolamento e custo.

6

Caracterizar um RTOS e o que o distingue de um SO de propósito geral.

1 · Motivação

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.

2 · Mapa

O que veremos nesta aula

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

3 · Conceito

Camadas do subsistema de E/S

Controladora. Hardware que interfaceia um dispositivo, com registradores de comando, status e dados que a CPU lê e escreve.
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.
AplicaçãoE/S independente
de dispositivo
DriverControladora
4 · Explicação

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.

5 · Exemplo

As três técnicas lado a lado

TécnicaComo descobre o fimCusto de CPUBom para
PollingCPU lê o status em laçoAlto (espera ocupada)Dispositivos rápidos; baixa latência
InterrupçãoDispositivo avisa a CPUMédio (1 ISR por evento)Dispositivos lentos/esporádicos
DMA1 interrupção ao fim do blocoBaixo (CPU livre durante a transferência)Alta vazão (disco, rede)
6 · Interativo

Passo a passo: uma leitura de disco com DMA

Passo 1
O driver programa a controladora de DMA: endereço de destino na RAM, número de bytes e a operação.
Passo 2
O SO bloqueia o processo que pediu a E/S e escalona outro — a CPU não fica esperando.
Passo 3
A controladora de DMA transfere os dados do disco direto para a RAM, byte a byte, sem a CPU.
Passo 4
Concluída a transferência do bloco, a controladora dispara uma única interrupção.
Passo 5
A ISR do driver confirma o término e o SO desbloqueia o processo, que recebe os dados.
7 · Conceito

DMA: Direct Memory Access

DMA (Direct Memory Access). Mecanismo em que uma controladora dedicada transfere blocos de dados diretamente entre o dispositivo e a RAM, sem a CPU copiar byte a byte; ela só é interrompida ao final.
🔑
Sem DMA, mover 1 MB de disco para a RAM consumiria milhões de operações da CPU só para copiar. Com DMA, a CPU programa a transferência, vai fazer outra coisa e recebe uma única interrupção ao fim. É indispensável para disco, rede e vídeo de alta vazão.
8 · Explicação

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.

9 · Analogia

Esperando uma encomenda

📦 Analogia
Polling é ficar na janela checando a rua a cada segundo se o carteiro chegou — você não faz mais nada. Interrupção é a campainha: você trabalha normalmente e atende quando ela toca. DMA é combinar com o porteiro que ele recebe a encomenda, guarda na sua sala e só te liga uma vez, quando tudo estiver lá. Quanto mais autônomo o mecanismo, menos a CPU desperdiça tempo.
10 · Comparação

Onde cada técnica brilha

DispositivoTécnica recomendadaPor quê
TecladoInterrupçãoEventos raros; não vale esperar
Sensor a 1 kHz em MCUPolling/timerLatência baixa e previsível; sem overhead de ISR
SSD NVMeDMA + interrupçãoAlta vazão; CPU livre durante a transferência
Rede 10 Gb/sDMA + polling adaptativoEvitar tempestade de interrupções
11 · Fluxo

Anatomia do tratamento de uma interrupção

Dispositivo
sinaliza IRQ
CPU salva
contexto
Vetor → ISR
do driver
Trata e
confirma
Restaura e
retorna
💡
Muitos SOs dividem a ISR em duas metades: a parte superior (top half), curtíssima, só reconhece a interrupção; a parte inferior (bottom half/tasklet) faz o trabalho pesado depois, com interrupções reabilitadas. Isso reduz o tempo com interrupções desligadas.
12 · Aprofundamento

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.

13 · Interativo

Verifique seu entendimento

Por que o DMA reduz o uso da CPU em transferências grandes?

No DMA, a controladora dedicada faz a cópia byte a byte. A CPU programa a transferência e fica livre, recebendo uma única interrupção quando o bloco termina — em vez de copiar tudo ela mesma.
14 · Caso prático

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.

15 · Erros comuns

Confusões frequentes

⚠️
Erros comuns nesta aula:
• 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.
16 · Dicas

Como escolher a técnica de E/S

Decida pela tríade vazão × frequência × previsibilidade: muita vazão pede DMA; eventos raros pedem interrupção; latência fixa e crítica pode pedir polling por timer. Para drivers, mantenha a ISR curta (top half) e empurre o trabalho pesado para depois (bottom half). E sempre prefira E/S em blocos grandes com buffer a muitas operações minúsculas.
17 · Interativo

Revele a resposta

Por que drivers são a maior fonte de falhas em kernels monolíticos?
Num kernel monolítico, os drivers executam em modo núcleo, com acesso direto ao hardware e à memória do kernel. Um ponteiro inválido ou um deadlock dentro de um driver não fica isolado: corrompe estruturas do kernel ou trava o sistema inteiro. Como há muitos drivers, escritos por muitos fabricantes e com qualidade variável, eles concentram a maioria dos crashes. Microkernels mitigam isso rodando drivers em modo usuário, isolados — ao custo de overhead de troca de mensagens.
18 · Flashcards

Revisão relâmpago

Pollingvirar
CPU consulta o status do dispositivo em laço (espera ocupada). Alto custo de CPU.
Interrupçãovirar
O dispositivo avisa a CPU quando termina; libera a CPU, mas custa uma ISR por evento.
DMAvirar
Controladora transfere blocos direto à RAM; uma única interrupção ao fim.
Device drivervirar
Módulo que conhece a controladora e oferece interface uniforme (open/read/write/ioctl).
Top/bottom halfvirar
ISR dividida: parte curta reconhece o IRQ; parte adiada faz o trabalho pesado.
19 · Conexões

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).
20 · Conceito

Virtualização: máquinas virtuais e contêineres

Máquina virtual (VM). Um hipervisor virtualiza o hardware; cada VM roda seu próprio SO completo, isolada das demais.
Contêiner. Isolamento no nível do SO: vários contêineres compartilham o kernel do hospedeiro, isolando processos por namespaces e cgroups.
AspectoVMContêiner
IsolaHardware (via hipervisor)Processos (mesmo kernel)
PesoSO completo por VMLeve (compartilha kernel)
InícioSegundosMilissegundos
IsolamentoForte (fronteira de hardware)Mais fraco (mesmo kernel)
21 · Explicação

Como a virtualização usa o hardware

Virtualizar com segurança exige apoio do hardware. Quando uma VM executa uma instrução privilegiada (acessar um dispositivo, alterar a tabela de páginas), ela não pode mexer no hardware real diretamente. O hardware de virtualização (Intel VT-x, AMD-V) faz a CPU "sair" para o hipervisor (VM exit), que emula a operação e devolve o controle.

Para a memória, há tabelas de páginas aninhadas (EPT/NPT): a MMU traduz duas vezes — endereço da VM → endereço "físico" da VM → endereço físico real —, isolando a memória de cada VM. É a MMU da Aula 8 elevada a outro nível. Contêineres, por não virtualizarem hardware, dispensam isso, mas por isso isolam menos.

22 · Exemplo

Tipos de hipervisor

TipoOnde rodaExemplosUso típico
Tipo 1 (bare-metal)Direto no hardwareESXi, Xen, Hyper-VServidores, nuvem
Tipo 2 (hospedado)Sobre um SO hospedeiroVirtualBox, VMware WorkstationDesktop, testes
💡
Tipo 1 tem menos overhead (fala direto com o hardware) e domina a nuvem. Tipo 2 é mais prático para uso pessoal, ao custo de uma camada extra (o SO hospedeiro) entre a VM e o metal.
23 · Comparação

Mecanismos de segurança de plataforma

MecanismoO que fazApoio de hardware
Boot seguroVerifica assinatura de cada estágioChaves na raiz de hardware
Raiz de confiançaGuarda chaves e mede o bootTPM / enclave seguro
IsolamentoSepara processos e SOModos de CPU, MMU/MPU
Menor privilégioMínimo de permissões por componenteAnéis, capacidades
24 · Aprofundamento EC

Tempo real: quando a média não basta

Tempo real. A correção depende não só do resultado, mas de quando ele é produzido: o sistema deve cumprir prazos (deadlines).
Rígido (hard). Perder um prazo é falha catastrófica (airbag, controle de voo, marca-passo).
Flexível (soft). Perder um prazo degrada a qualidade, mas é tolerável (streaming, jogos).
🔑
RTOS não significa "rápido": significa previsível. Prefere-se um pior caso conhecido e limitado a uma média baixa com variância alta.
25 · Explicação

Determinismo: o pior caso é tudo

O coração do tempo real é o determinismo: a garantia de que toda operação termina dentro de um limite de tempo conhecido. Para provar que um sistema cumpre seus prazos, o engenheiro precisa do WCET (Worst-Case Execution Time) de cada tarefa — quanto ela leva no pior cenário possível.

O problema é que muitos recursos que melhoram a média pioram o pior caso e tornam o WCET difícil de calcular: caches (acerto ou erro?), pipelines com predição de desvio, paginação para disco, coleta de lixo. Por isso, em tempo real rígido, esses recursos são desabilitados, controlados ou substituídos por alternativas previsíveis (memória fixa, sem swap, sem GC).

26 · Conceito

Latência, jitter e WCET

Latência de interrupção. Tempo entre o evento físico e o início do seu tratamento.
Jitter. Variação da latência entre ocorrências sucessivas. Em controle, o jitter pode ser pior que uma latência alta porém constante.
WCET. Tempo de execução no pior caso de uma tarefa — base para provar escalonabilidade.
27 · Comparação

RTOS × SO de propósito geral

AspectoRTOSSO de propósito geral
ObjetivoCumprir prazos (determinismo)Vazão e interatividade médias
EscalonadorPreemptivo por prioridade fixaJustiça, time-sharing
MemóriaEstática/fixa, sem swapVirtual, com paginação
TamanhoKB (FreeRTOS, Zephyr)MB a GB (Linux, Windows)
FocoPior caso (WCET)Caso médio
28 · Caso prático

FreeRTOS em um ESP32

O FreeRTOS é um kernel de tempo real minúsculo (poucos KB) muito usado em microcontroladores como ARM Cortex-M e ESP32. Oferece tarefas, escalonamento preemptivo por prioridade, filas, semáforos e mutex com herança de prioridade — tudo o que um sistema embarcado de tempo real precisa, sem MMU nem swap.

// criando uma tarefa periódica no FreeRTOS xTaskCreate(tarefaSensor, "sensor", STACK, NULL, PRIORIDADE, NULL); void tarefaSensor(void *p) { TickType_t ultimo = xTaskGetTickCount(); for(;;) { leSensor(); vTaskDelayUntil(&ultimo, pdMS_TO_TICKS(10)); // período fixo de 10 ms } }

Em um robô ou drone, tarefas como ler IMU (alta frequência), estabilizar (controle) e telemetria (baixa frequência) coexistem com prioridades RM, comunicando-se por filas.

29 · Síntese

Resumo da aula

🔑
O SO organiza a E/S em camadas para esconder a diversidade do hardware. A CPU descobre o fim de uma operação por polling (pergunta em laço, caro), interrupção (o dispositivo avisa) ou DMA (a controladora transfere blocos sozinha e avisa uma vez). Drivers dão interface uniforme, mas, em modo núcleo, concentram falhas. A técnica certa depende de vazão, frequência e previsibilidade — e o tempo real às vezes prefere polling.
Mão na massa · colaborativo

Atividade em grupo · Escolhendo a técnica de E/S

Em trios, decidam polling, interrupção ou DMA para cada dispositivo.

⏱️ 25 min👥 trios🧩 projeto de sistema

Roteiro

  1. Considerem: teclado, sensor lido a 1 kHz num microcontrolador, SSD NVMe e placa de rede 10 Gb.
  2. Para cada um, justifiquem a técnica de transferência mais adequada.
  3. Avaliem o impacto na latência e no uso de CPU.
  4. Discutam por que um RTOS pode preferir polling em certos casos.
Engenheiro de E/Sescolhe a técnica
Analista de latênciaavalia o tempo de resposta
Relatorjustifica as escolhas
📤 Entrega: Tabela dispositivo→técnica de E/S com justificativa.
Teste seu conhecimento

Mini-quiz · Aula 13

20 questões sobre esta aula. Escolha e veja a explicação na hora.

0/20

📌 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.
  • Máquina virtual isola um sistema inteiro; contêiner isola processos sobre o mesmo núcleo.
  • Num RTOS o que importa é o pior caso: determinismo, latência limitada e jitter previsível.