Entrada e saída

Controladores, varrimento, interrupções, DMA e custo de CPU por transferência.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Um sensor produz um bloco de dados e o CPU precisa de o recolher antes de o buffer voltar a encher. O controlador expõe comandos, estado e dados e faz a ponte entre o dispositivo e o sistema. Polling, interrupções e DMA repartem de formas diferentes o trabalho de consultar, transferir e notificar.

Interface com o controlador

Registos de comando iniciam ações; de estado indicam pronto, ocupado ou erro; de dados transportam informação. Em memory-mapped I/O, ocupam endereços no espaço de memória; em I/O isolado, usam instruções ou um espaço de portas próprio.

Uma leitura de registo pode ter efeito, como remover um item de uma fila. Não trates um acesso a I/O automaticamente como uma leitura comum que o compilador ou a cache pode eliminar/reordenar. A plataforma define permissões, ordenação e zonas não cacheáveis.

Um barramento partilhado dá acesso alternado aos participantes. Ligações ponto a ponto e pontes podem permitir tráfegos simultâneos, mas cada caminho tem largura e limites. A taxa do periférico não implica que todo o percurso suporte essa taxa.

Varrimento periódico

Se uma consulta custa CC ciclos e se repete a cada PP ciclos, a fração do CPU é C/PC/P. Com C=200C=200 e P=10000P=10000, são 2%. Mesmo que apenas metade das consultas encontre dados, o CPU paga todas. A atividade do dispositivo e a ocupação do CPU têm denominadores diferentes.

Em polling, o CPU consulta o estado e, quando necessário, transfere dados. Um ciclo de espera ativa consulta repetidamente; um varrimento periódico executa consultas a intervalos definidos. Não são o mesmo custo.

Se o periférico pode receber R bytes/s e armazena blocos de B bytes, são no máximo q=R/Bq=R/B blocos/s. Com um só bloco de armazenamento, o intervalo de consulta não pode exceder B/RB/R no modelo ideal; atraso do serviço também deve caber na margem disponível.

Para 16000 bits/s e blocos 400 bits: 40 blocos/s e intervalo 25 ms. Se cada consulta custa 300 ciclos num CPU a 2 GHz, a ocupação por consultas é 40×300/(2×109)=0,00000640\times300/(2\times10^9)=0,000006, isto é 0,0006%. Conta separadamente a transferência se esse custo ainda não a inclui. O vídeo acompanha a relação entre taxa de chegada, tamanho do bloco e período de consulta.

Abrir no YouTube

Interrupções

O dispositivo notifica o CPU quando precisa de serviço. O CPU conserva o estado necessário, identifica a origem, executa uma rotina e retoma a tarefa interrompida. Prioridades, máscara e possibilidade de interrupções aninhadas definem quem espera e quem pode interromper quem.

Com atividade média de 10% no exemplo anterior, chegam 4 blocos/s e há 4 interrupções/s. O polling exigiria 40 consultas/s para suportar o máximo.

Contudo, uma rotina de interrupção pode custar mais do que uma consulta.

Se polling custa qpcpq_pc_p ciclos/s e interrupções custam uqmaxciu q_{max}c_i, o ponto de igualdade é:

u=qpcpqmax⁡ci.u=\frac{q_pc_p}{q_{\max}c_i}.

Com qp=qmax⁡q_p=q_{\max}, consulta 400 ciclos e interrupção 600, interrupções gastam menos abaixo de u=2/3u=2/3. Isso compara custo de CPU; não prova que a latência ou a capacidade sejam suficientes.

O vídeo mostra o desvio para a rotina de interrupção e a retoma da tarefa interrompida.

Abrir no YouTube

Latência de comunicação e tamanho da mensagem

Uma ligação com maior taxa pode ter maior custo fixo por mensagem. Num modelo sem sobreposição, o tempo completo de uma mensagem de BB bytes é:

t(B)=tenvio+tligac\ca~o+trecec\ca~o+BR.t(B)=t_{\rm envio}+t_{\rm ligação}+t_{\rm receção}+\frac{B}{R}.

RR mede bytes por segundo; as outras parcelas são atrasos, não taxas. Compara duas redes do mesmo modelo docente, com unidades decimais:

ParcelaRede ARede B
Taxa de transmissão1,125 MB/s10 MB/s
Envio por software200 μs207 μs
Ligação21 μs56 μs
Receção por software241 μs360 μs

Os custos fixos somam 462 μs em A e 623 μs em B. Cada byte demora 8/98/9 μs em A e 0,1 μs em B. Para 250 bytes, os tempos são aproximadamente 684,22 μs e 648 μs: B termina primeiro apesar do custo fixo maior.

Para saber onde muda a escolha, iguala os tempos, todos em μs:

462+89B=623+0,1B.462+\frac89B=623+0,1B.

A diferença fixa é 161 μs; cada byte reduz a vantagem de A em 8/9−0,1=71/908/9-0,1=71/90 μs. Logo:

B=161×9071≈204,085 bytes.B=\frac{161\times90}{71}\approx204,085\ \text{bytes}.

Para tamanhos inteiros, A é mais rápida até 204 bytes e B a partir de 205. Esse limiar depende destes custos e do modelo sem sobreposição; não é uma propriedade universal de redes rápidas. Se envio, transferência e receção se sobrepuserem, segue o caminho crítico em vez de somar todos os tempos.

DMA

Se preparar e concluir uma transferência custa 500 ciclos e transferir por programa custa 4 ciclos por byte, os custos igualam-se em 500/4=125500/4=125 bytes. Acima desse tamanho, o custo de CPU do DMA é menor neste modelo, antes de considerar contenção e sobreposição.

O CPU configura origem/destino, tamanho e direção; o controlador transfere diretamente entre dispositivo e memória; uma interrupção ou outro mecanismo assinala o fim. O CPU paga preparação e conclusão, mas não uma operação por palavra.

Para taxa R bytes/s, blocos de B bytes, custo c ciclos por transferência e frequência f, o número de transferências por segundo é R/BR/B e a fração de CPU é:

uCPU=RBcf.u_{\rm CPU}=\frac{R}{B}\frac{c}{f}.

Com dois discos de 100 MB/s cada, 1800 ciclos de preparação e 200 de conclusão, CPU 2 GHz e limite 1%, a taxa agregada é R=200×106R=200\times10^6 e c=2000c=2000:

B≥200×106×20000,01×2×109=20000 bytes=20 kB.B\ge\frac{200\times10^6\times2000}{0,01\times2\times10^9}=20000\ \text{bytes}=20\ \text{kB}.

São unidades decimais. Reduzir o bloco aumenta o número de transferências; mais dispositivos ativos aumentam o custo agregado.

DMA e dados em cache

DMA de entrada pode escrever na RAM enquanto o CPU conserva uma cópia antiga em cache. DMA de saída pode ler RAM antiga enquanto uma linha WB dirty contém dados novos.

Antes de DMA de saída, descarrega as linhas dirty relevantes e respeita a ordenação exigida. Para entrada, assegura que nenhuma linha dirty velha volta a sobrescrever os dados recebidos e invalida as cópias antigas no momento definido pela plataforma. Em hardware coerente, o protocolo pode realizar parte desse trabalho. Não uses um simples invalidate como substituto de um clean necessário.

O sistema operativo costuma gerir essas condições, o mapeamento e a vida dos buffers. O programa deve respeitar quem possui o buffer durante a transferência, porque alterar dados enquanto o dispositivo os usa pode produzir resultados inconsistentes.

Custo, latência e limite de taxa

DMA liberta tempo de CPU, mas usa interligador e memória. Preparação pode dominar blocos pequenos; interrupções muito frequentes podem saturar o CPU. Calcula separadamente taxa de bytes, taxa de transferências, ciclos por transferência e latência de um pedido. São medidas de aspetos diferentes.

Exercícios

Escolher consultas e calcular ocupação

Entrada de 16000 bits/s e buffer de 400 bits, removido numa consulta. Cada consulta custa 300 ciclos num CPU de 2 GHz. Calcula o intervalo máximo ideal e a ocupação de CPU por consultas nessa frequência. Ignora atraso adicional na remoção e calcula apenas consultas, sem custo de transferência.

Solução

Chegam 16000/400=40 blocos/s. O intervalo máximo ideal é 1/40 s=25 ms. As consultas gastam 40×300=12000 ciclos/s; a fração é 12000/(2×10⁹)=0,000006, ou 0,0006%. O serviço real precisa de margem para a remoção, atrasos e jitter.

Confere a tua resposta:

  • Obtive 40 blocos por segundo e intervalo ideal de 25 ms.
  • Calculei 12000 ciclos de consulta por segundo.
  • Obtive ocupação 0,0006% sem contar transferência ou jitter.
Voltar à explicação
Comparar custos de serviço

Polling 40 consultas/s a 400 ciclos; interrupções 40 u/s a 600 ciclos. Qual ocupação u iguala custos? Responde como fração, entre 0 e 1.

Pista
Iguala ciclos por segundo.
Solução

u=400/600=2/3. Abaixo deste valor, interrupções gastam menos ciclos no modelo dado.

Erros frequentes

Assumir que uma interrupção custa igual a uma consulta.

Voltar à explicação
Dimensionar o bloco para três discos

Três discos de 60 MB/s cada, continuamente ativos; DMA 1600 ciclos por bloco; CPU 3 GHz; limite 2% CPU; MB decimal. Qual tamanho mínimo de bloco de cada transferência?

Pista
Usa a taxa agregada de 180 MB/s.
Solução

B≥180×10⁶×1600/(0,02×3×10⁹)=4800 bytes. Cada disco faz 12500 transferências/s; os três gastam 37500×1600=60 milhões de ciclos/s, ou 2% do CPU.

Erros frequentes

Reduzir o bloco quando aumenta a taxa agregada ou usar 2 como fração de 2%.

Voltar à explicação
Preparar DMA de saída

DMA de saída lê RAM, sem coerência de hardware. O CPU tem dados novos em linha WB dirty. Qual preparação é necessária?

A tua resposta

Pista
A versão nova ainda pode existir só na cache.
Solução

Faz clean/write-back das linhas relevantes, ordena antes do arranque e respeita o protocolo de posse do buffer. Invalidar só descarta a cópia; não é substituto de escrever os dados novos.

  • Descarregar dados dirty e aplicar a ordenação da plataforma. O dispositivo deve ler a versão mais recente na memória.
  • Invalidar sem descarregar todos os dados dirty. Isso pode perder os dados novos antes de DMA os ler.
  • Não fazer nada porque a cache é válida. Válida e dirty pode diferir da RAM; faltaria garantia de coerência.

Erros frequentes

Confundir validade com igualdade RAM ou tratar entrada e saída DMA da mesma forma.

Voltar à explicação
Uma rede mais rápida pode demorar mais numa mensagem curta

Rede A: taxa 1,125 MB/s e atrasos de envio, ligação e receção 200,21,241 μs. Rede B: taxa 10 MB/s e atrasos correspondentes 207,56,360 μs. MB é decimal; as parcelas não se sobrepõem. Qual rede termina primeiro uma mensagem de 200 bytes? Determina a partir de que tamanho inteiro B passa a ser mais rápida. Não uses só a taxa anunciada.

Solução

Os custos fixos são 462 μs e 623 μs. A transferência de 200 bytes custa 200×8/9≈177,778 μs em A e 20 μs em B. Totais 639,778 μs e 643 μs, portanto A ganha. Igualando 462+(8/9)B=623+0,1B, obtém-se B=161×90/71≈204,085 bytes. Como o tamanho é inteiro, A ganha até 204 bytes e B a partir de 205. A vantagem fixa de A deixa de compensar a transferência mais lenta quando a mensagem cresce.

Confere a tua resposta:

  • Incluí custos fixos de envio, ligação e receção.
  • Obtive 639,778 μs e 643 μs para 200 bytes.
  • Obtive um limiar de cerca de 204,085 bytes.
  • Escolhi A até 204 bytes e B a partir de 205.
Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.