Ir para o conteúdo
TI - Organização e Arquitetura dos Computadores

Arquitetura de Von Neumann, Processadores (RISC e CISC), Pipeline e Barramentos

O que mais cai

Parte do tópico Importância O que a banca cobra
Arquitetura de Von Neumann e arquitetura de Harvard Alta Programa armazenado; componentes; gargalo de Von Neumann; memórias separadas em Harvard; ciclo de instrução e registradores
Processador, RISC, CISC e pipeline Alta Unidade de controle e ULA; RISC contra CISC; modos de endereçamento; tempo de CPU; pipeline e conflitos; núcleos e SMT
Barramentos Alta Dados, endereços e controle; sentido de cada um; largura e capacidade de endereçamento; serial e paralelo; PCI Express
Outros conceitos de arquitetura dos computadores Média Hierarquia de memória; cache e mapeamento; taxonomia de Flynn; interrupção e DMA; lei de Amdahl

Do que trata o tópico

Este tópico ensina como o computador se organiza por dentro: o modelo de Von Neumann e o de Harvard, o ciclo que o processador repete para executar cada instrução, as duas filosofias de projeto de processador (RISC e CISC), a técnica de pipeline, que sobrepõe instruções para ganhar desempenho, e os barramentos, que ligam o processador à memória e aos dispositivos. O tópico também cobre conceitos vizinhos que a prova mistura com esses: hierarquia de memória, memória cache, taxonomia de Flynn, interrupções, acesso direto à memória e lei de Amdahl.

Conteúdo

Arquitetura de Von Neumann e arquitetura de Harvard

Os primeiros computadores eletrônicos eram programados com cabos e chaves. Para trocar o programa, um técnico refazia as ligações do painel, e isso levava horas ou dias. O problema era claro: o programa fazia parte da máquina física, e não dos dados que a máquina lia.

A solução ficou conhecida como conceito de programa armazenado: as instruções do programa ficam na memória, no mesmo formato binário dos dados, e o processador as busca uma a uma. Trocar de programa passa a ser só carregar outro conteúdo na memória. A descrição mais divulgada dessa ideia é atribuída a John von Neumann, e por isso a organização recebe o nome dele.

A arquitetura de Von Neumann é a organização em que uma única memória guarda as instruções e os dados, e um único caminho liga essa memória ao processador. Ela tem cinco elementos clássicos: a unidade de controle, a unidade lógica e aritmética, a memória, a entrada e a saída. A unidade de controle e a unidade lógica e aritmética formam juntas a unidade central de processamento (UCP, ou CPU, do inglês central processing unit).

As características que a prova cobra são estas:

  1. Instruções e dados ficam na mesma memória, e o processador não distingue um do outro pelo lugar: a instrução é o que o contador de programa aponta.
  2. A memória é endereçada por posição: cada célula tem um endereço numérico, sem relação com o conteúdo.
  3. A execução é sequencial: depois de uma instrução, o processador executa a do endereço seguinte, salvo quando uma instrução de desvio muda o caminho.
  4. O mesmo barramento leva instruções e dados entre a memória e a CPU.

O preço dessa simplicidade é o gargalo de Von Neumann. Como instrução e dado usam o mesmo caminho, o processador não busca a próxima instrução no mesmo instante em que lê ou grava um dado. Além disso, o processador ficou muito mais rápido que a memória ao longo das décadas, e a CPU passa boa parte do tempo esperando a memória responder.

A arquitetura de Harvard separa as duas coisas: uma memória para instruções e outra para dados, cada uma com o próprio barramento. Assim, a CPU busca a próxima instrução e acessa um dado no mesmo ciclo. O nome vem do computador Harvard Mark I, que lia as instruções de uma fita perfurada e guardava os dados em outro meio.

A arquitetura de Harvard aparece em microcontroladores e em processadores digitais de sinais (DSP), que precisam de tempo previsível e de alta vazão. A desvantagem é a rigidez: o espaço de cada memória é fixo, e um programa grande não usa a sobra da memória de dados.

Os processadores de uso geral atuais usam a arquitetura de Harvard modificada. A memória principal é única, como em Von Neumann, mas dentro do processador o primeiro nível de cache é dividido em cache de instruções e cache de dados. Na prática, o programador vê uma memória só, e o processador ganha o acesso simultâneo nos casos mais comuns.

Os registradores do ciclo de instrução. Os registradores são pequenas memórias dentro da CPU, as mais rápidas da máquina. Cinco registradores aparecem no modelo didático de Von Neumann:

  • Contador de programa (PC, program counter): guarda o endereço da próxima instrução.
  • Registrador de instrução (IR, instruction register): guarda a instrução que está sendo executada.
  • Registrador de endereço de memória (MAR, memory address register, ou REM): guarda o endereço que a CPU vai ler ou gravar.
  • Registrador de dados de memória (MBR, memory buffer register, ou RDM): guarda o dado que veio da memória ou que vai para ela.
  • Acumulador (AC): guarda o resultado das operações da unidade lógica e aritmética.

O processador repete o ciclo de instrução enquanto está ligado. O ciclo tem duas fases principais, a busca e a execução, e os livros detalham as etapas assim:

  1. Busca da instrução: o PC vai para o MAR, a memória devolve a instrução no MBR, e a instrução passa ao IR.
  2. Incremento do PC: o PC passa a apontar para a instrução seguinte.
  3. Decodificação: a unidade de controle interpreta o código de operação que está no IR.
  4. Busca dos operandos: se a instrução usa dado da memória, o endereço do dado vai para o MAR e o dado chega ao MBR.
  5. Execução: a unidade lógica e aritmética faz a operação, ou a unidade de controle faz a transferência ou o desvio.
  6. Escrita do resultado: o resultado vai para um registrador ou para a memória.
  7. Verificação de interrupção: se algum dispositivo pediu atenção, a CPU desvia para a rotina que trata o pedido.
  1. Busca a instrução no endereço do PC
  2. Incrementa o PC
  3. Decodifica a instrução no IR
  4. Busca os operandos
  5. Executa a operação
  6. Grava o resultado
  7. Há interrupção pendente?
    SimDesvia para a rotina de tratamento
    NãoVolta à busca da próxima instrução
Ciclo de instrução

Exemplo resolvido: uma máquina de acumulador tem o programa abaixo na memória, a partir do endereço 100. O endereço 200 guarda o valor 7, o endereço 201 guarda o valor 5, e o PC começa em 100.

100: LOAD  200   ; AC recebe o conteúdo do endereço 200
101: ADD   201   ; AC recebe AC mais o conteúdo do endereço 201
102: STORE 202   ; o endereço 202 recebe o conteúdo de AC
  1. Busca: o PC (100) vai para o MAR, e a instrução LOAD 200 chega ao IR. O PC passa a 101.
  2. Execução do LOAD: o endereço 200 vai para o MAR, o valor 7 chega ao MBR e passa ao AC. O AC vale 7.
  3. Busca: o PC (101) vai para o MAR, e a instrução ADD 201 chega ao IR. O PC passa a 102.
  4. Execução do ADD: o valor 5 chega ao MBR, e a unidade lógica e aritmética soma 7 + 5. O AC vale 12.
  5. Busca: o PC (102) vai para o MAR, e a instrução STORE 202 chega ao IR. O PC passa a 103.
  6. Execução do STORE: o endereço 202 vai para o MAR, o valor 12 vai para o MBR e é gravado na memória.

Resultado: o endereço 202 guarda 12, e o PC vale 103. Cada instrução usou a memória duas vezes (uma para a instrução e uma para o dado), sempre pelo mesmo caminho.

Na prática, uma fabricante de leitores de crachá escolhe um microcontrolador com memória de programa separada da memória de dados. O programa fica gravado numa memória que não se apaga, e o dado do crachá lido fica numa memória de trabalho. As duas memórias trabalham ao mesmo tempo, e o tempo de resposta fica previsível.

A diferença para o conceito vizinho cabe em uma frase: em Von Neumann, há uma memória e um caminho para instruções e dados; em Harvard, há duas memórias e dois caminhos. A arquitetura de Harvard não abandona o programa armazenado: o programa continua guardado em memória, só que numa memória própria.

O erro comum é dizer que os computadores pessoais atuais seguem a arquitetura de Harvard pura. Eles seguem Von Neumann na memória principal e usam a separação de Harvard só no primeiro nível de cache. Outro erro é chamar o gargalo de Von Neumann de defeito da unidade de controle, quando ele é uma limitação do caminho compartilhado entre CPU e memória.

Na arquitetura de Von Neumann, as instruções e os dados ficam em memórias distintas, e o gargalo de Von Neumann decorre da diferença de velocidade entre essas duas memórias.

Comentário:

Regra: na arquitetura de Von Neumann, uma única memória guarda instruções e dados, e o gargalo vem do caminho único entre essa memória e a CPU.

A afirmação erra em as instruções e os dados ficam em memórias distintas: memórias distintas são a marca da arquitetura de Harvard. Erra também em da diferença de velocidade entre essas duas memórias: o gargalo vem do caminho compartilhado e da memória mais lenta que o processador.

Resultado: errado.

300: LOAD  400
301: ADD   401
302: ADD   401
303: STORE 402

Considere o programa acima, numa máquina de acumulador com arquitetura de Von Neumann. O PC começa em 300, o endereço 400 guarda 4 e o endereço 401 guarda 3. Ao fim da execução da instrução do endereço 303, assinale a alternativa correta.

  1. A) O acumulador vale 7, e o endereço 402 guarda 7.
  2. B) O PC vale 303, porque aponta para a última instrução executada.
  3. C) O registrador de instrução guarda o valor 10, que é o resultado da soma.
  4. D) O endereço 402 guarda 10, e o PC vale 304.
  5. E) O programa fez quatro acessos à memória, um por instrução.

Comentário:

A) Errada.

Conta: o LOAD põe 4 no AC; o primeiro ADD dá 4 + 3 = 7; o segundo ADD dá 7 + 3 = 10.

A alternativa erra em O acumulador vale 7, e o endereço 402 guarda 7: o segundo ADD soma 3 de novo, e o AC chega a 10 antes do STORE.

B) Errada.

Regra: o PC é incrementado logo depois da busca, e por isso aponta para a próxima instrução.

A alternativa erra em O PC vale 303, porque aponta para a última instrução executada: depois de buscar a instrução de 303, o PC passa a 304.

C) Errada.

Regra: o registrador de instrução guarda a instrução em execução, e o resultado da operação fica no acumulador.

A alternativa erra em O registrador de instrução guarda o valor 10: o IR guarda a instrução STORE 402, e o valor 10 está no AC e na memória.

D) Certa.

Conta: 4 + 3 + 3 = 10; o STORE grava 10 no endereço 402; o PC, incrementado após a busca da instrução 303, vale 304.

O resultado da soma vai para o endereço 402, e o PC aponta para a instrução seguinte à última executada.

E) Errada.

Regra: em Von Neumann, cada instrução exige um acesso para ser buscada, e a instrução que usa dado da memória exige mais um acesso.

A alternativa erra em quatro acessos à memória, um por instrução: cada uma das quatro instruções faz a busca e um acesso ao dado, num total de oito acessos.

Resultado: alternativa D.

Como a banca cobra: a banca troca as características de Von Neumann e de Harvard, pede a ordem das etapas do ciclo de instrução ou a função de um registrador, e afirma que o computador pessoal atual é Harvard pura.

Processador, RISC, CISC e pipeline

O processador executa as instruções do programa. Para isso, ele precisa interpretar cada instrução, fazer a conta pedida e guardar o resultado. Cada tarefa cabe a uma parte dele.

Componentes do processador. A unidade de controle (UC) busca as instruções, decodifica cada uma e gera os sinais que comandam as outras partes. A unidade lógica e aritmética (ULA) faz as contas (soma, subtração) e as operações lógicas (E, OU, NÃO, comparação). Os registradores guardam os valores em uso, e o relógio (clock) dá o ritmo: a cada pulso, a CPU avança uma etapa.

A unidade de controle tem duas formas de implementação. Na unidade de controle por hardware (hardwired), os sinais saem de circuitos lógicos fixos, rápidos, mas difíceis de mudar. Na unidade de controle microprogramada, cada instrução de máquina é executada por uma sequência de microinstruções guardadas numa memória de controle, o que facilita criar instruções complexas, ao custo de mais tempo por instrução.

Desempenho do processador. A frequência do relógio é medida em hertz: um processador de 2 GHz tem 2 bilhões de ciclos por segundo, e cada ciclo dura 0,5 ns. O tempo de execução de um programa depende de três fatores: o número de instruções executadas, a média de ciclos por instrução (CPI) e a duração do ciclo.

Nessa fórmula, é o tempo de execução do programa, é o número de instruções executadas, é a média de ciclos de relógio por instrução, é a duração de um ciclo e é a frequência do relógio. A fórmula mostra por que a frequência sozinha não mede o desempenho: um processador mais rápido no relógio perde se executa mais instruções ou gasta mais ciclos em cada uma.

CISC. No início da computação, a memória era cara e lenta, e os compiladores eram simples. Os projetistas criaram então conjuntos de instruções ricos, em que uma única instrução faz um trabalho grande, como copiar um bloco de memória. Esse projeto recebeu o nome CISC (complex instruction set computer, computador com conjunto complexo de instruções).

As características do CISC são estas: muitas instruções, de tamanho variável; muitos modos de endereçamento; instruções que operam direto sobre a memória; várias instruções que gastam muitos ciclos; e unidade de controle microprogramada. O programa fica menor, porque cada instrução faz mais coisa. A família x86, dos computadores pessoais, é o exemplo clássico de CISC.

RISC. Estudos de programas reais mostraram que a maior parte do tempo de execução usa um pequeno grupo de instruções simples. Daí veio o RISC (reduced instruction set computer, computador com conjunto reduzido de instruções): poucas instruções simples, que o hardware executa depressa, e o trabalho complexo fica a cargo do compilador.

As características do RISC são estas: instruções de tamanho fixo e formato regular; poucos modos de endereçamento; muitos registradores de uso geral; acesso à memória só pelas instruções de carga (load) e de armazenamento (store), o que se chama arquitetura load/store; a maioria das instruções executada em um ciclo; e unidade de controle por hardware. O tamanho fixo facilita o pipeline, porque a CPU sabe onde começa a próxima instrução sem decodificar a atual. ARM, MIPS e RISC-V são exemplos de RISC.

O programa RISC costuma ter mais instruções que o equivalente CISC, porque cada instrução faz menos, mas cada uma gasta menos ciclos.

Hoje a fronteira é menos nítida. Os processadores x86 atuais recebem instruções CISC e as traduzem internamente em microoperações simples, executadas por um núcleo com características de RISC. Assim, o conjunto de instruções visível ao programador continua CISC, e a execução interna se parece com RISC.

Exemplo resolvido: dois processadores de 2 GHz executam a mesma tarefa. O compilador CISC gera 600 milhões de instruções, com CPI médio de 4. O compilador RISC gera 1 bilhão de instruções, com CPI médio de 1,5.

  1. Tempo CISC: .
  2. Numerador CISC: 6 × 10⁸ × 4 = 2,4 × 10⁹ ciclos.
  3. Tempo CISC: 2,4 × 10⁹ ÷ 2 × 10⁹ = 1,2 s.
  4. Tempo RISC: 10⁹ × 1,5 = 1,5 × 10⁹ ciclos; 1,5 × 10⁹ ÷ 2 × 10⁹ = 0,75 s.

Resultado: o RISC executa mais instruções e termina antes, em 0,75 s contra 1,2 s. O número de instruções sozinho não decide o desempenho.

Modos de endereçamento. Uma instrução que soma ou carrega um valor precisa dizer onde esse valor está: na própria instrução, num registrador ou numa posição da memória. O modo de endereçamento é a regra que a CPU usa para achar o operando a partir do campo da instrução. O endereço final em que o operando está se chama endereço efetivo. O CISC oferece muitos modos, e o RISC fica com poucos, para manter a instrução simples.

A tabela abaixo mostra os modos que a prova mais cobra, com uma instrução de exemplo em linguagem de montagem genérica.

Modo Exemplo Onde está o operando Acessos à memória para o operando
Imediato LOAD R1, #500 O próprio número 500, dentro da instrução Nenhum
Direto LOAD R1, 500 Na posição 500 da memória Um
Indireto LOAD R1, (500) Na posição cujo endereço está guardado em 500 Dois
Por registrador ADD R1, R2 Dentro do registrador R2 Nenhum
Indireto por registrador LOAD R1, (R2) Na posição cujo endereço está em R2 Um
Indexado LOAD R1, 500(R2) Na posição 500 mais o valor de R2 Um
Relativo BEQ +8 No endereço do PC mais 8 Não se aplica, é desvio

O imediato é o mais rápido, mas o valor fica fixo no programa e limitado ao tamanho do campo. O direto e o indireto diferem num acesso: no direto, a posição indicada guarda o operando; no indireto, a posição indicada guarda o endereço do operando, e a CPU precisa de um acesso a mais. O indexado soma um valor fixo ao conteúdo de um registrador de índice e serve para percorrer vetores: o 500 marca o início do vetor, e o registrador avança item por item. O relativo soma um deslocamento ao PC e é o modo típico dos desvios, porque o programa continua certo mesmo se for carregado em outro endereço.

Exemplo resolvido: a posição 500 da memória guarda 800, a posição 800 guarda 42, a posição 503 guarda 7 e o registrador R2 vale 3. Qual valor chega a R1 em cada instrução?

  1. LOAD R1, #500 (imediato): o operando é o próprio número, e R1 recebe 500.
  2. LOAD R1, 500 (direto): a CPU lê a posição 500, e R1 recebe 800.
  3. LOAD R1, (500) (indireto): a CPU lê a posição 500 e obtém o endereço 800; depois lê a posição 800, e R1 recebe 42.
  4. LOAD R1, 500(R2) (indexado): o endereço efetivo é 500 + 3 = 503, e R1 recebe 7.

Resultado: com o mesmo número 500 na instrução, R1 recebe 500, 800, 42 ou 7, conforme o modo. O erro mais comum é trocar o imediato com o direto, isto é, tratar o número da instrução como endereço quando ele é o próprio valor.

Pipeline. Uma lavanderia com lavadora, secadora e mesa de dobrar não espera a primeira carga ser dobrada para lavar a segunda. Enquanto a primeira carga seca, a segunda já está na lavadora. O pipeline (encadeamento de instruções) aplica a mesma ideia ao processador: o ciclo de instrução é dividido em estágios, e cada estágio trabalha numa instrução diferente ao mesmo tempo.

O pipeline clássico de cinco estágios, usado nos livros com processadores RISC, é este:

  1. IF (busca da instrução): lê a instrução no endereço do PC.
  2. ID (decodificação): interpreta a instrução e lê os registradores de origem.
  3. EX (execução): a ULA faz a operação ou calcula o endereço.
  4. MEM (acesso à memória): as instruções de carga e de armazenamento leem ou gravam a memória.
  5. WB (escrita do resultado, write back): o resultado vai para o registrador de destino.
  1. IF busca a instrução
  2. ID decodifica e lê os registradores
  3. EX executa na ULA
  4. MEM acessa a memória de dados
  5. WB grava o resultado no registrador
Pipeline de cinco estágios

O pipeline não diminui o tempo de uma instrução isolada (a latência): cada instrução continua passando pelos cinco estágios. O ganho está na vazão (throughput), isto é, no número de instruções concluídas por unidade de tempo. Com o pipeline cheio, sai uma instrução por ciclo.

Para estágios de duração e instruções, sem conflitos, os tempos são estes:

Nas fórmulas, é o tempo sem pipeline, é o tempo com pipeline, é o número de estágios, é o número de instruções e é a duração de um estágio. A primeira instrução gasta ciclos para sair, e cada uma das outras sai um ciclo depois da anterior. O ganho (speedup) é a razão entre os dois tempos e se aproxima de quando é grande.

Exemplo resolvido: um processador tem pipeline de 5 estágios de 1 ns cada e executa 100 instruções sem conflito.

  1. Sem pipeline: 100 × 5 × 1 ns = 500 ns.
  2. Com pipeline: (5 + 100 - 1) × 1 ns = 104 ns.
  3. Ganho: 500 ÷ 104 ≈ 4,81.

Resultado: o pipeline deixa a execução cerca de 4,81 vezes mais rápida, perto do máximo teórico de 5, que é o número de estágios.

Conflitos do pipeline. O ganho ideal some quando uma instrução não pode avançar no ciclo previsto. Esses casos se chamam conflitos (hazards), e são de três tipos:

  • Conflito estrutural: duas instruções precisam do mesmo recurso no mesmo ciclo, como uma memória única para a busca (IF) e para o acesso a dado (MEM). A solução é duplicar o recurso, por exemplo com caches separadas de instruções e de dados.
  • Conflito de dados: uma instrução precisa de um resultado que a anterior ainda não gravou. As soluções são o adiantamento (forwarding, ou bypassing), que entrega o resultado da saída da ULA direto à instrução seguinte, a bolha (stall), que para a instrução por um ou mais ciclos, e a reordenação das instruções pelo compilador.
  • Conflito de controle: um desvio condicional só se resolve no meio do pipeline, e as instruções buscadas depois dele podem ser as erradas. As soluções são a previsão de desvio (branch prediction), que aposta num caminho e descarta as instruções se errar, e o desvio atrasado (delayed branch), em que o compilador põe uma instrução útil logo depois do desvio.
ADD R1, R2, R3   ; R1 recebe R2 + R3
SUB R4, R1, R5   ; usa R1, que o ADD ainda não gravou

No trecho acima, o SUB lê R1 no estágio ID, mas o ADD só grava R1 no estágio WB. Sem tratamento, o SUB leria o valor antigo de R1. Com adiantamento, o valor calculado pelo ADD no estágio EX segue direto para o EX do SUB, e o pipeline não para.

Além do pipeline simples. O superpipeline divide o ciclo em mais estágios, mais curtos, para subir a frequência, e o custo é uma perda maior quando a previsão de desvio erra. O processador superescalar tem vários pipelines e inicia mais de uma instrução por ciclo, e por isso o CPI pode ficar abaixo de 1. A execução fora de ordem deixa uma instrução independente passar à frente de uma que espera dado. A arquitetura VLIW (very long instruction word) deixa ao compilador a tarefa de juntar várias operações independentes numa instrução longa.

Palavra de 32 e de 64 bits. A palavra é a quantidade de bits que o processador trata de uma vez, e em geral é o tamanho dos registradores de uso geral. Um processador de 64 bits soma dois números de 64 bits numa só operação, enquanto o de 32 bits precisa de duas operações para o mesmo trabalho. A palavra também limita os endereços: com endereços de 32 bits, o espaço de endereçamento de um programa vai até 2³² bytes, isto é, 4 GiB. Por isso os sistemas de 32 bits ficam presos perto de 4 GiB de memória, e os de 64 bits superam esse limite com folga.

Núcleos e threads. Subir a frequência do relógio esbarrou no limite de calor e de consumo de energia, e os fabricantes passaram a pôr vários processadores completos no mesmo chip. Cada um deles é um núcleo (core), com unidade de controle, ULA, registradores e cache L1 próprios; os núcleos em geral dividem a cache L3. O processador multinúcleo (multicore) executa várias threads (fluxos de execução de um programa) de fato ao mesmo tempo, uma por núcleo, e por isso é um caso de MIMD na taxonomia de Flynn, vista em "Outros conceitos".

O multithreading simultâneo (SMT, simultaneous multithreading), que a Intel vende com o nome Hyper-Threading, é outra coisa. Um núcleo com SMT guarda o estado de duas threads (dois conjuntos de registradores e de PC) e usa as unidades de execução que uma thread deixa paradas para adiantar a outra. O sistema operacional enxerga dois processadores lógicos por núcleo, e assim um chip de 4 núcleos com SMT mostra 8 processadores lógicos. O ganho do SMT é bem menor que o de dobrar os núcleos, porque as duas threads dividem a mesma ULA e a mesma cache.

A frequência e os núcleos ajudam em situações diferentes. A frequência maior acelera cada thread, inclusive a do programa que roda numa thread só. Mais núcleos só aceleram a parte do trabalho que se divide em threads paralelas, e a lei de Amdahl, também em "Outros conceitos", mede esse limite. Um programa de uma thread só não ganha nada com 16 núcleos em vez de 4.

Na prática, a equipe de sistemas de uma prefeitura compara dois servidores para o sistema de protocolo. O servidor A tem relógio mais rápido, mas o servidor B executa a mesma carga com CPI menor e termina antes. A escolha correta usa o tempo de execução da carga real, e não a frequência anunciada.

A diferença para o conceito vizinho que mais aparece é entre pipeline e superescalar. O pipeline sobrepõe as etapas de instruções diferentes num único fluxo, e a meta é uma instrução concluída por ciclo; o superescalar replica os pipelines e conclui mais de uma instrução por ciclo. Também se confunde latência com vazão: o pipeline melhora a vazão, e não a latência de cada instrução.

O erro comum é dizer que o pipeline faz cada instrução terminar mais depressa. Outro erro é dizer que o RISC tem instruções de tamanho variável ou que acessa a memória com qualquer instrução: tamanho fixo e arquitetura load/store são marcas do RISC.

Em processadores RISC, o acesso à memória de dados é feito apenas por instruções de carga e de armazenamento, e as operações da unidade lógica e aritmética trabalham sobre registradores, o que favorece o uso de pipeline.

Comentário:

Regra: o RISC segue a arquitetura load/store, em que só as instruções de carga e de armazenamento acessam a memória, e as demais operam sobre registradores.

A afirmação descreve a arquitetura load/store. Com operandos em registradores e instruções de tamanho fixo, cada instrução tem duração regular, e o pipeline flui com menos conflitos.

Resultado: certo.

No modo de endereçamento indexado, o endereço efetivo é a soma do campo de endereço da instrução com o conteúdo de um registrador de índice; já no modo indireto, a posição de memória indicada na instrução guarda o próprio operando, e a CPU o obtém com um único acesso à memória.

Comentário:

Regra: no modo indireto, a posição indicada na instrução guarda o endereço do operando, e a CPU faz dois acessos à memória; o modo em que a posição indicada guarda o próprio operando é o direto.

A primeira parte está certa e descreve o modo indexado. A afirmação erra em a posição de memória indicada na instrução guarda o próprio operando, e a CPU o obtém com um único acesso à memória: essa é a descrição do modo direto. No indireto, a CPU lê primeiro o endereço e depois o operando.

Resultado: errado.

Um processador de 3 GHz executa um programa de 9 × 10⁹ instruções com CPI médio de 2. Uma nova versão do compilador reduz o número de instruções para 6 × 10⁹, mas eleva o CPI médio para 2,5. Sobre o tempo de execução, assinale a alternativa correta.

  1. A) O tempo cai de 6 s para 4 s, porque o número de instruções caiu um terço.
  2. B) O tempo cai de 6 s para 5 s, e a nova versão é mais rápida apesar do CPI maior.
  3. C) O tempo sobe de 6 s para 7,5 s, porque o CPI subiu.
  4. D) O tempo fica em 6 s, porque a frequência do relógio não mudou.
  5. E) O tempo cai de 18 s para 15 s, porque o tempo é o número de instruções vezes o CPI.

Comentário:

A) Errada.

Conta: novo tempo = 6 × 10⁹ × 2,5 ÷ 3 × 10⁹ = 5 s.

A alternativa erra em O tempo cai de 6 s para 4 s: o CPI maior anula parte do ganho, e o novo tempo é 5 s.

B) Certa.

Conta: tempo antigo = 9 × 10⁹ × 2 ÷ 3 × 10⁹ = 6 s; tempo novo = 6 × 10⁹ × 2,5 ÷ 3 × 10⁹ = 5 s.

O número de ciclos cai de 18 × 10⁹ para 15 × 10⁹, e a frequência é a mesma. Por isso o programa termina antes, mesmo com o CPI maior.

C) Errada.

Conta: tempo novo = 15 × 10⁹ ciclos ÷ 3 × 10⁹ ciclos por segundo = 5 s.

A alternativa erra em O tempo sobe de 6 s para 7,5 s: o CPI subiu, mas o número de instruções caiu mais, e o tempo desceu.

D) Errada.

Regra: o tempo de CPU depende do número de instruções, do CPI e da duração do ciclo, e não só da frequência.

A alternativa erra em O tempo fica em 6 s, porque a frequência do relógio não mudou: a frequência igual não impede a mudança do número de ciclos gastos.

E) Errada.

Conta: instruções × CPI dá ciclos, e não segundos; 15 × 10⁹ ciclos ÷ 3 × 10⁹ = 5 s.

A alternativa erra em O tempo cai de 18 s para 15 s: 18 × 10⁹ e 15 × 10⁹ são números de ciclos, que ainda precisam ser divididos pela frequência.

Resultado: alternativa B.

Num pipeline ideal de 5 estágios, cada instrução passa a ser executada em um quinto do tempo que gastaria sem pipeline, e por isso a latência de cada instrução diminui na mesma proporção do número de estágios.

Comentário:

Regra: o pipeline aumenta a vazão, isto é, o número de instruções concluídas por unidade de tempo, mas cada instrução continua passando por todos os estágios.

A afirmação erra em cada instrução passa a ser executada em um quinto do tempo e em a latência de cada instrução diminui: a latência fica igual ou até cresce um pouco, pelos registradores entre os estágios. O que se aproxima de 5 vezes é a vazão.

Resultado: errado.

Um pipeline tem 4 estágios de 2 ns cada e executa 50 instruções, sem conflitos. Assinale a alternativa que traz o tempo total com pipeline e a explicação correta.

  1. A) 400 ns, porque cada instrução gasta 4 estágios de 2 ns.
  2. B) 100 ns, porque sai uma instrução a cada 2 ns desde o primeiro ciclo.
  3. C) 108 ns, porque a primeira instrução leva 4 ciclos e as outras saem uma por ciclo.
  4. D) 104 ns, porque são 50 + 4 - 2 = 52 ciclos de 2 ns.
  5. E) 106 ns, porque o tempo é (estágios + instruções - 1) × duração do estágio.

Comentário:

A) Errada.

Conta: sem pipeline, o tempo é 50 × 4 × 2 ns = 400 ns.

A alternativa erra em 400 ns, porque cada instrução gasta 4 estágios de 2 ns: esse é o tempo sem pipeline, em que as instruções não se sobrepõem.

B) Errada.

Regra: a primeira instrução só sai depois de passar por todos os estágios, e só então sai uma instrução por ciclo.

A alternativa erra em sai uma instrução a cada 2 ns desde o primeiro ciclo: o pipeline precisa de 4 ciclos para encher antes da primeira saída.

C) Errada.

Conta: (4 + 50 - 1) × 2 ns = 53 × 2 ns = 106 ns.

A alternativa erra em 108 ns: a explicação está certa, mas a conta dá 106 ns, e não 108 ns.

D) Errada.

Conta: o número de ciclos é k + n - 1 = 4 + 50 - 1 = 53, e 53 × 2 ns = 106 ns.

A alternativa erra em 50 + 4 - 2 = 52 ciclos: o pipeline precisa de 4 ciclos para a primeira instrução e de 49 ciclos para as outras, num total de 53.

E) Certa.

Conta: (k + n - 1) × t = (4 + 50 - 1) × 2 ns = 106 ns.

A primeira instrução gasta 4 ciclos, e cada uma das outras 49 sai um ciclo depois, num total de 53 ciclos de 2 ns.

Resultado: alternativa E.

Como a banca cobra: a banca troca as características de RISC e de CISC, pede o cálculo do tempo de CPU ou do tempo com pipeline, troca o modo direto com o indireto, e associa cada solução (adiantamento, bolha, previsão de desvio) ao conflito errado.

Barramentos

O processador, a memória e os dispositivos de entrada e saída precisam trocar informações o tempo todo. Ligar cada componente a todos os outros com fios próprios exigiria um número enorme de ligações. A solução é o barramento: um conjunto de linhas de comunicação compartilhado por vários componentes, com regras de uso.

Como as linhas são compartilhadas, só um componente transmite por vez num mesmo barramento. Os outros podem receber. Por isso o barramento precisa de um mecanismo que decida quem transmite, a arbitragem.

Os três tipos de linha. O barramento de sistema tem três grupos de linhas, e a prova cobra a função e o sentido de cada um:

  • Barramento de dados: transporta o conteúdo, isto é, as instruções e os dados. É bidirecional, porque o dado vai da CPU para a memória na escrita e volta na leitura. A largura (número de linhas) diz quantos bits passam de uma vez.
  • Barramento de endereços: transporta o endereço da posição de memória ou do dispositivo de entrada e saída. No modelo didático, é unidirecional, da CPU para a memória e os dispositivos. A largura define a quantidade de posições endereçáveis.
  • Barramento de controle: transporta os sinais de comando e de estado, como leitura, escrita, relógio, pedido de interrupção, pedido de barramento e confirmação. Cada linha tem um sentido próprio, e o grupo como um todo é bidirecional.

A conta da capacidade de endereçamento é a mais cobrada. Com linhas de endereço, a CPU forma endereços diferentes. Se cada endereço aponta um byte, a memória máxima é bytes.

Na primeira fórmula, é o número de linhas do barramento de endereços. Na segunda, a largura em bytes é o número de linhas de dados dividido por 8, e as transferências por segundo dependem da frequência do barramento e de quantas transferências ele faz por ciclo.

Exemplo resolvido: um barramento tem 32 linhas de endereço e 64 linhas de dados, opera a 100 MHz e faz uma transferência por ciclo. A memória é endereçada por byte.

  1. Posições endereçáveis: 2³² = 4.294.967.296.
  2. Em binário, 2³² bytes = 2² × 2³⁰ bytes = 4 GiB (gibibytes, potências de 1.024).
  3. Largura de dados em bytes: 64 ÷ 8 = 8 bytes por transferência.
  4. Taxa: 8 bytes × 100 × 10⁶ transferências por segundo = 800 × 10⁶ bytes por segundo = 800 MB/s.
  5. Com duas transferências por ciclo (técnica de taxa dupla, usada nas memórias DDR), a taxa dobra para 1.600 MB/s.

Resultado: o barramento endereça 4 GiB e transfere 800 MB/s. A largura de endereços limita o tamanho da memória; a largura de dados e a frequência limitam a velocidade. Aqui a diferença entre 1.000 e 1.024 importa: 4 GiB são 4.294.967.296 bytes, enquanto 4 GB são 4.000.000.000 bytes.

Como funciona uma leitura de memória. A sequência mostra o papel de cada grupo de linhas:

  1. A CPU obtém o controle do barramento
  2. A CPU põe o endereço no barramento de endereços
  3. A CPU ativa o sinal de leitura no barramento de controle
  4. A memória localiza a posição
  5. A memória põe o conteúdo no barramento de dados
  6. A CPU copia o dado para o registrador
Leitura da memória pelo barramento

Classificações. Os barramentos se classificam por vários critérios, e cada um tem um par que a prova troca:

  1. Paralelo ou serial. O barramento paralelo transmite vários bits ao mesmo tempo, em várias linhas. O serial transmite um bit por vez numa linha (ou num par de linhas). Em frequências altas, as linhas paralelas sofrem com a defasagem (skew), isto é, os bits enviados juntos chegam em instantes diferentes, e com a interferência entre linhas vizinhas. Por isso as ligações modernas (PCI Express, SATA, USB) são seriais e muito rápidas.
  2. Síncrono ou assíncrono. No barramento síncrono, os eventos seguem um relógio comum, e cada operação ocupa um número fixo de ciclos. No assíncrono, não há relógio comum: cada transferência segue uma troca de sinais de pedido e de confirmação (handshake), o que permite ligar dispositivos de velocidades diferentes.
  3. Dedicado ou multiplexado. No dedicado, cada função tem linhas próprias (endereço numas linhas, dado noutras). No multiplexado, as mesmas linhas levam o endereço num momento e o dado no momento seguinte, o que economiza linhas e custa tempo.
  4. Arbitragem centralizada ou distribuída. Na centralizada, um único árbitro decide quem usa o barramento. Na distribuída, os próprios dispositivos decidem entre si. Na encadeada (daisy chain), o sinal de concessão passa de dispositivo em dispositivo, e o mais próximo do árbitro tem prioridade maior.

Hierarquia de barramentos. Um barramento único para tudo ficaria lento, porque o dispositivo lento ocuparia o caminho do rápido. Os computadores usam vários níveis: o barramento local, que liga a CPU à cache; o barramento de sistema, que liga a CPU à memória principal; e os barramentos de expansão, que ligam os dispositivos de entrada e saída. Nas placas-mãe antigas, a ponte norte (northbridge) ligava a CPU à memória e ao vídeo, e a ponte sul (southbridge) cuidava dos dispositivos mais lentos; hoje o controlador de memória fica dentro do próprio processador.

Padrões que a prova cita. O PCI é um barramento paralelo e compartilhado de expansão. O PCI Express (PCIe) o substituiu com ligações seriais ponto a ponto, em que cada dispositivo tem um caminho próprio até o controlador. Cada caminho é formado por vias (lanes), e cada via tem um par de fios para enviar e outro para receber; os encaixes x1, x4, x8 e x16 indicam o número de vias, e a placa de vídeo usa em geral o x16. O SATA liga discos e unidades de estado sólido de forma serial, e o USB liga periféricos externos de forma serial, com conexão e desconexão com o computador ligado.

Na prática, o técnico de um tribunal precisa instalar uma placa de captura numa estação de trabalho. A placa pede um encaixe PCIe x4. Ele pode usar um encaixe x16 livre, porque uma placa com menos vias funciona num encaixe com mais vias, mas não pode usar um encaixe x1, em que a placa x4 não cabe fisicamente.

A diferença para o conceito vizinho mais cobrada é entre a largura do barramento de dados e a do barramento de endereços. A largura de dados define quanto passa de uma vez (velocidade); a largura de endereços define quantas posições existem (capacidade de memória). Também se troca o sentido: dados são bidirecionais, endereços são unidirecionais no modelo didático.

O erro comum é achar que o barramento serial é sempre mais lento que o paralelo. Em frequências baixas, o paralelo leva vantagem; nas frequências altas de hoje, o serial vence porque não sofre com a defasagem entre linhas.

Num computador cuja memória é endereçada por byte, ampliar o barramento de endereços de 20 para 24 linhas multiplica por 16 a quantidade máxima de memória endereçável, sem alterar, por si só, a quantidade de bits transferida a cada acesso.

Comentário:

Conta: 2²⁴ ÷ 2²⁰ = 2⁴ = 16; com 20 linhas, a CPU endereça 1.048.576 bytes (1 MiB), e com 24 linhas, 16 MiB.

As 4 linhas a mais multiplicam a capacidade por 16. Os bits transferidos em cada acesso dependem da largura do barramento de dados, que não mudou.

Resultado: certo.

Sobre os barramentos de um computador, assinale a alternativa correta.

  1. A) O barramento de dados é bidirecional, e a sua largura define quantos bits a CPU transfere em cada acesso à memória.
  2. B) O barramento de endereços é bidirecional, porque a memória devolve o endereço lido para a CPU conferir.
  3. C) Um barramento de controle de 32 linhas permite endereçar até 4 GiB de memória.
  4. D) O PCI Express é um barramento paralelo compartilhado, em que todas as placas dividem as mesmas linhas.
  5. E) Nos barramentos síncronos, cada transferência é coordenada por sinais de pedido e de confirmação, sem relógio comum.

Comentário:

A) Certa.

Regra: o barramento de dados leva o conteúdo nos dois sentidos (leitura e escrita), e a sua largura é o número de bits transferidos de uma vez.

Na escrita, o dado sai da CPU; na leitura, chega a ela. Um barramento de dados de 64 linhas transfere 64 bits por acesso.

B) Errada.

Regra: no modelo didático, o endereço sai da CPU para a memória e para os dispositivos, e o barramento de endereços é unidirecional.

A alternativa erra em O barramento de endereços é bidirecional, porque a memória devolve o endereço lido para a CPU conferir: a memória devolve o dado, pelo barramento de dados, e não o endereço.

C) Errada.

Regra: a capacidade de endereçamento depende do número de linhas do barramento de endereços, e não do barramento de controle.

A alternativa erra em Um barramento de controle de 32 linhas: o barramento de controle leva sinais de comando, como leitura e escrita. São 32 linhas de endereço que formam 2³² endereços.

D) Errada.

Regra: o PCI Express usa ligações seriais ponto a ponto, formadas por vias, e cada dispositivo tem um caminho próprio.

A alternativa erra em é um barramento paralelo compartilhado, em que todas as placas dividem as mesmas linhas: essa descrição é a do PCI, que o PCI Express substituiu.

E) Errada.

Regra: o barramento síncrono segue um relógio comum; a troca de sinais de pedido e de confirmação é a marca do barramento assíncrono.

A alternativa erra em Nos barramentos síncronos: a descrição é a do barramento assíncrono.

Resultado: alternativa A.

Como a banca cobra: a banca troca a função ou o sentido dos barramentos de dados, endereços e controle, pede a capacidade de endereçamento ou a taxa de transferência, e afirma que o PCI Express é paralelo.

Outros conceitos de arquitetura dos computadores

Hierarquia de memória. Uma memória ao mesmo tempo grande, rápida e barata não existe. A memória rápida custa caro por byte, e a memória barata é lenta. A solução é a hierarquia de memória: vários níveis, do menor e mais rápido, perto da CPU, ao maior e mais lento, longe dela.

A ordem, do topo para a base, é esta: registradores, cache (níveis L1, L2 e L3), memória principal (RAM), armazenamento secundário (unidade de estado sólido e disco rígido) e armazenamento de reserva (fita, mídia removível). Ao descer na hierarquia, a capacidade aumenta, o custo por bit cai, o tempo de acesso cresce e a frequência de acesso pela CPU diminui. Os registradores, a cache e a RAM são voláteis, isto é, perdem o conteúdo sem energia; o armazenamento secundário não é volátil.

A hierarquia funciona por causa do princípio da localidade. A localidade temporal diz que um dado acessado agora tende a ser acessado de novo em breve, como a variável de um laço. A localidade espacial diz que, depois de acessar um endereço, o programa tende a acessar os vizinhos, como os itens seguintes de um vetor. Por isso a cache traz da RAM um bloco inteiro, e não só o byte pedido.

Memória cache. A cache é uma memória pequena e rápida, feita de SRAM, entre a CPU e a memória principal, feita de DRAM. Quando a CPU pede um endereço e ele está na cache, ocorre um acerto (hit); quando não está, ocorre uma falha (miss), e o bloco é trazido da memória principal. A taxa de acerto é a fração dos acessos que encontram o dado na cache.

Na fórmula, é o tempo médio de acesso à memória, é o tempo de acesso à cache, a taxa de falha é 1 menos a taxa de acerto, e a penalidade de falha é o tempo extra para trazer o bloco da memória principal.

Exemplo resolvido: a cache responde em 1 ns, a taxa de acerto é 95% e a penalidade de falha é 100 ns.

  1. Taxa de falha: 1 - 0,95 = 0,05.
  2. Tempo médio: 1 ns + 0,05 × 100 ns.
  3. Tempo médio: 1 ns + 5 ns = 6 ns.

Resultado: o tempo médio é 6 ns.

Mapeamento da cache. O mapeamento diz em que linha da cache cada bloco da memória pode ficar:

  • Mapeamento direto: cada bloco tem uma única linha possível, dada pelo resto da divisão do número do bloco pelo número de linhas. É simples e barato, mas dois blocos que disputam a mesma linha se expulsam um ao outro.
  • Mapeamento totalmente associativo: o bloco pode ficar em qualquer linha. Há menos conflitos, mas a cache precisa comparar o rótulo com todas as linhas ao mesmo tempo, o que custa hardware.
  • Mapeamento associativo por conjunto: as linhas formam conjuntos, o bloco tem um conjunto fixo e pode ocupar qualquer linha dentro dele. É o meio-termo usado na maioria dos processadores.

No mapeamento direto, o endereço se divide em três campos: o rótulo (tag), que identifica qual bloco ocupa a linha; o índice, que escolhe a linha; e o deslocamento (offset), que escolhe o byte dentro do bloco.

Exemplo resolvido: os endereços têm 16 bits, a cache usa mapeamento direto, tem 8 linhas e cada bloco tem 4 bytes. A CPU pede o endereço 0x00A6.

  1. Deslocamento: 4 bytes por bloco = 2² bytes, e o campo tem 2 bits.
  2. Índice: 8 linhas = 2³ linhas, e o campo tem 3 bits.
  3. Rótulo: 16 - 3 - 2 = 11 bits.
  4. 0x00A6 em binário: 0000 0000 1010 0110.
  5. Os 2 bits finais (10₂) dão o deslocamento 2.
  6. Os 3 bits seguintes (001₂) dão a linha 1.
  7. Os 11 bits iniciais (00000000101₂) dão o rótulo 5.

Resultado: o endereço 0x00A6 vai para a linha 1 da cache, com rótulo 5, no byte 2 do bloco. Se a linha 1 tem rótulo 5, há acerto; se tem outro rótulo, há falha.

Quando a cache está cheia, a política de substituição escolhe o bloco que sai: LRU (least recently used, o usado há mais tempo), FIFO (o que entrou primeiro) ou aleatória. Na escrita, a política write-through grava o dado na cache e na memória principal ao mesmo tempo, e a write-back grava só na cache e atualiza a memória quando o bloco sai. Para isso, a write-back marca cada bloco alterado com um bit de modificação (dirty bit), e só o bloco marcado é copiado para a memória na saída. A write-through é mais simples e deixa a memória sempre atualizada, mas gera mais tráfego no barramento; a write-back economiza escritas, mas a memória fica desatualizada por um tempo.

Taxonomia de Flynn. Michael Flynn classificou os computadores pelo número de fluxos de instruções e de fluxos de dados processados ao mesmo tempo:

Classe Fluxo de instruções Fluxo de dados Exemplo
SISD Único Único Processador clássico de um núcleo
SIMD Único Múltiplo Processador vetorial, GPU, extensões vetoriais
MISD Múltiplo Único Raro, sistemas redundantes de controle
MIMD Múltiplo Múltiplo Processador de vários núcleos, clusters

Na SIMD, a mesma instrução opera sobre vários dados ao mesmo tempo, como somar dois vetores elemento por elemento numa só operação. Na MIMD, cada processador executa o próprio programa sobre os próprios dados.

Interrupção e acesso direto à memória. A CPU precisa saber quando um dispositivo terminou uma tarefa. Na entrada e saída programada (polling), a CPU pergunta ao dispositivo, em laço, se ele está pronto, e gasta tempo em espera. Na entrada e saída por interrupção, o dispositivo avisa a CPU por um sinal, e a CPU suspende o programa, salva o contexto, executa a rotina de tratamento e depois volta ao ponto em que parou.

No acesso direto à memória (DMA, direct memory access), um controlador próprio transfere um bloco de dados entre o dispositivo e a memória sem a CPU copiar cada palavra. A CPU só programa a transferência (origem, destino e quantidade) e recebe uma interrupção no fim. Durante a transferência, o controlador de DMA usa o barramento, e a CPU pode perder alguns ciclos de barramento, o que se chama roubo de ciclo.

Ordem dos bytes. Um valor de vários bytes pode ser guardado em duas ordens. No big-endian, o byte mais significativo fica no menor endereço; no little-endian, o menos significativo fica no menor endereço. O valor 0x12345678, gravado a partir do endereço 0, fica 12 34 56 78 em big-endian e 78 56 34 12 em little-endian. A família x86 é little-endian.

Lei de Amdahl. A lei de Amdahl limita o ganho de uma melhoria que acelera só uma parte do programa:

Na fórmula, é o ganho total, é a fração do tempo de execução que a melhoria alcança e é o ganho dessa fração.

Exemplo resolvido: 80% do tempo de um programa é paralelizável e roda 4 vezes mais rápido com 4 núcleos.

  1. Parte não melhorada: 1 - 0,8 = 0,2.
  2. Parte melhorada: 0,8 ÷ 4 = 0,2.
  3. Ganho: 1 ÷ (0,2 + 0,2) = 1 ÷ 0,4 = 2,5.

Resultado: o ganho total é 2,5, e não 4. Mesmo com infinitos núcleos, o ganho não passa de 1 ÷ 0,2 = 5, porque a parte sequencial continua igual.

Na prática, a área de TI de um órgão estadual pensa em trocar os servidores de 4 núcleos por modelos de 16 núcleos para acelerar um relatório. A medição mostra que só metade do tempo do relatório é paralelizável. Pela lei de Amdahl, o ganho máximo com núcleos infinitos é 1 ÷ 0,5 = 2, e a equipe decide primeiro reescrever a parte sequencial.

A diferença para o conceito vizinho que a prova mais troca é entre cache e memória virtual: a cache acelera o acesso à memória principal, e a memória virtual usa o disco para dar aos programas a impressão de uma memória principal maior. Também se troca localidade temporal com espacial: a temporal fala do mesmo endereço no tempo; a espacial, dos endereços vizinhos.

O erro comum é colocar a cache abaixo da memória principal na hierarquia, ou dizer que a cache é feita de DRAM. A cache fica entre os registradores e a RAM e usa SRAM, mais rápida e mais cara.

Uma cache com mapeamento direto tem 16 linhas e blocos de 8 bytes, num sistema com endereços de 32 bits e memória endereçada por byte. Sobre a divisão do endereço, assinale a alternativa correta.

  1. A) Deslocamento de 8 bits, índice de 16 bits e rótulo de 8 bits.
  2. B) Deslocamento de 3 bits, índice de 4 bits e rótulo de 25 bits.
  3. C) Deslocamento de 3 bits, índice de 4 bits e rótulo de 29 bits.
  4. D) Deslocamento de 4 bits, índice de 3 bits e rótulo de 25 bits.
  5. E) Deslocamento de 3 bits, sem índice, porque no mapeamento direto o bloco pode ocupar qualquer linha.

Comentário:

A) Errada.

Conta: blocos de 8 bytes = 2³, deslocamento de 3 bits; 16 linhas = 2⁴, índice de 4 bits.

A alternativa erra em Deslocamento de 8 bits, índice de 16 bits e rótulo de 8 bits: o tamanho do campo é o expoente da potência de 2, e não a quantidade de bytes ou de linhas.

B) Certa.

Conta: deslocamento = 3 bits (2³ = 8); índice = 4 bits (2⁴ = 16); rótulo = 32 - 4 - 3 = 25 bits.

Os três campos somam 3 + 4 + 25 = 32 bits, o tamanho do endereço.

C) Errada.

Conta: rótulo = 32 - 4 - 3 = 25 bits.

A alternativa erra em rótulo de 29 bits: os campos somariam 36 bits, mais que o endereço de 32 bits.

D) Errada.

Conta: 8 bytes por bloco pedem 3 bits de deslocamento, e 16 linhas pedem 4 bits de índice.

A alternativa erra em Deslocamento de 4 bits, índice de 3 bits: os tamanhos dos dois campos estão trocados.

E) Errada.

Regra: no mapeamento direto, cada bloco tem uma única linha possível, escolhida pelo índice; o bloco em qualquer linha é o mapeamento totalmente associativo.

A alternativa erra em sem índice, porque no mapeamento direto o bloco pode ocupar qualquer linha: a descrição é a do mapeamento totalmente associativo.

Resultado: alternativa B.

Pela taxonomia de Flynn, a unidade de processamento gráfico que aplica a mesma operação a milhares de pixels ao mesmo tempo segue o modelo SIMD, enquanto um processador com vários núcleos que executam programas independentes segue o modelo MIMD.

Comentário:

Regra: na SIMD, uma única instrução opera sobre vários dados ao mesmo tempo; na MIMD, vários processadores executam instruções próprias sobre dados próprios.

A GPU aplica a mesma instrução a muitos pixels, o que é SIMD. Os núcleos independentes executam fluxos de instruções diferentes sobre dados diferentes, o que é MIMD.

Resultado: certo.

O servidor de arquivos de um órgão público lê blocos grandes do disco o dia todo, e a equipe quer reduzir o tempo que a CPU gasta com essas transferências. Sobre as técnicas de entrada e saída, assinale a alternativa correta.

  1. A) Na entrada e saída programada, o dispositivo avisa a CPU por um sinal quando termina, e a CPU fica livre para outro trabalho enquanto espera.
  2. B) Na entrada e saída por interrupção, o controlador copia o bloco inteiro para a memória sem a CPU e só avisa no fim da transferência.
  3. C) No DMA, a CPU programa a transferência com a origem, o destino e a quantidade de dados, e recebe uma interrupção quando o bloco inteiro chega à memória.
  4. D) No DMA, a CPU não recebe interrupção em nenhum momento, porque o controlador de DMA dispensa qualquer aviso.
  5. E) No roubo de ciclo, a CPU toma ciclos de barramento do controlador de DMA para terminar a transferência mais depressa.

Comentário:

A) Errada.

Regra: na entrada e saída programada, a CPU pergunta ao dispositivo, em laço, se ele está pronto, e fica ocupada nessa espera.

A alternativa erra em o dispositivo avisa a CPU por um sinal quando termina, e a CPU fica livre para outro trabalho enquanto espera: essa é a descrição da entrada e saída por interrupção.

B) Errada.

Regra: na entrada e saída por interrupção, o dispositivo avisa a CPU, mas a CPU ainda executa a rotina que copia cada dado entre o dispositivo e a memória.

A alternativa erra em o controlador copia o bloco inteiro para a memória sem a CPU e só avisa no fim da transferência: essa é a descrição do DMA.

C) Certa.

Regra: no DMA, a CPU só programa a transferência, o controlador de DMA move o bloco, e uma interrupção avisa a CPU no fim.

A CPU fica livre durante a cópia do bloco e só volta a agir para tratar a interrupção final. Por isso o DMA é a técnica indicada para blocos grandes.

D) Errada.

Regra: o DMA usa uma interrupção no fim da transferência para avisar a CPU.

A alternativa erra em a CPU não recebe interrupção em nenhum momento: o DMA dispensa a CPU da cópia, mas não dispensa o aviso final por interrupção.

E) Errada.

Regra: no roubo de ciclo, o controlador de DMA usa ciclos de barramento que seriam da CPU, e a CPU espera esses ciclos.

A alternativa erra em a CPU toma ciclos de barramento do controlador de DMA: quem toma os ciclos é o controlador de DMA, e quem perde os ciclos é a CPU.

Resultado: alternativa C.

Na política de escrita write-back, cada escrita feita na cache é repetida de imediato na memória principal, o que mantém a memória sempre atualizada e dispensa o bit de modificação dos blocos.

Comentário:

Regra: na write-back, a escrita fica só na cache, o bloco alterado recebe o bit de modificação, e a memória principal só é atualizada quando esse bloco sai da cache.

A afirmação erra em cada escrita feita na cache é repetida de imediato na memória principal, o que mantém a memória sempre atualizada: essa é a descrição da write-through. Também erra em dispensa o bit de modificação: a write-back depende desse bit para saber quais blocos precisam voltar à memória.

Resultado: errado.

Um programa gasta 60% do tempo numa parte que pode ser dividida entre núcleos, e o restante é sequencial. Ao passar de 1 para 3 núcleos, com ganho perfeito na parte paralela, o tempo total do programa cai pela metade.

Comentário:

Conta: S = 1 ÷ (0,4 + 0,6 ÷ 3) = 1 ÷ (0,4 + 0,2) = 1 ÷ 0,6 ≈ 1,67.

A afirmação erra em o tempo total do programa cai pela metade: o tempo novo é 0,4 + 0,2 = 0,6 do tempo antigo, isto é, cai 40%, e não 50%. Cair pela metade exigiria ganho 2, e com 3 núcleos o ganho fica em cerca de 1,67. Mesmo com núcleos infinitos, o ganho não passa de 1 ÷ 0,4 = 2,5, porque a parte sequencial continua igual.

Resultado: errado.

Como a banca cobra: a banca pede a ordem da hierarquia de memória, a divisão do endereço na cache ou o tempo médio de acesso, troca SIMD com MIMD e confunde interrupção com DMA.

  • Organização do computador
    • Von Neumann
      • Programa armazenado
      • Memória única
      • Gargalo de Von Neumann
    • Harvard
      • Memórias separadas
      • Harvard modificada
    • Ciclo de instrução
      • Busca e execução
      • PC, IR, MAR, MBR
    • Processador
      • Unidade de controle
      • Unidade lógica e aritmética
      • RISC e CISC
      • Modos de endereçamento
      • Núcleos e SMT
    • Pipeline
      • Cinco estágios
      • Conflitos estrutural, de dados, de controle
      • Superescalar
    • Barramentos
      • Dados, endereços, controle
      • Serial e paralelo
      • PCI Express
    • Outros conceitos
      • Hierarquia de memória
      • Cache e mapeamento
      • Taxonomia de Flynn
      • Interrupção e DMA
      • Write-through e write-back
      • Lei de Amdahl

Quadros e comparações

A tabela abaixo compara as arquiteturas de Von Neumann e de Harvard.

Aspecto Von Neumann Harvard
Memória Única para instruções e dados Uma para instruções e outra para dados
Caminho até a CPU Um barramento compartilhado Barramentos separados
Acesso simultâneo Não, há o gargalo Sim, instrução e dado no mesmo ciclo
Uso típico Memória principal dos computadores Microcontroladores, DSP, cache L1 dividida

A tabela abaixo compara RISC e CISC.

Aspecto RISC CISC
Conjunto de instruções Pequeno e simples Grande e complexo
Tamanho da instrução Fixo Variável
Acesso à memória Só carga e armazenamento Muitas instruções acessam a memória
Registradores Muitos, de uso geral Menos registradores
Unidade de controle Por hardware Microprogramada
Ciclos por instrução Em geral um Vários
Exemplos ARM, MIPS, RISC-V Família x86

A tabela abaixo compara os três grupos de linhas do barramento de sistema.

Barramento Leva Sentido Largura define
Dados Instruções e dados Bidirecional Bits por transferência
Endereços Endereço da posição Unidirecional, da CPU Memória endereçável
Controle Sinais de comando e estado Bidirecional no conjunto Não se aplica

Para decorar

  • Von Neumann: memória única e barramento único para instruções e dados.
  • Harvard: memórias e barramentos separados para instruções e dados.
  • Gargalo de Von Neumann: o caminho único entre CPU e memória limita o desempenho.
  • Ciclo de instrução: busca, incremento do PC, decodificação, busca de operandos, execução, escrita e verificação de interrupção.
  • PC: endereço da próxima instrução; IR: instrução atual; MAR: endereço; MBR: dado.
  • Tempo de CPU: .
  • RISC: instrução fixa, load/store, muitos registradores, controle por hardware.
  • CISC: instrução variável, muitos modos de endereçamento, controle microprogramado.
  • Modos de endereçamento: imediato (valor na instrução), direto (endereço na instrução), indireto (endereço do endereço), por registrador, indexado (base mais índice), relativo (PC mais deslocamento).
  • SMT ou Hyper-Threading: dois processadores lógicos por núcleo, com a mesma ULA e a mesma cache.
  • DMA: a CPU programa, o controlador move o bloco, uma interrupção avisa no fim.
  • Write-through: grava na cache e na memória; write-back: grava só na cache e usa o bit de modificação.
  • Pipeline clássico: IF, ID, EX, MEM e WB.
  • Tempo com pipeline: .
  • Pipeline: melhora a vazão, não a latência.
  • Barramento de dados: bidirecional; de endereços: unidirecional; de controle: sinais de comando.
  • Capacidade de endereçamento: posições para linhas de endereço.
  • Tempo médio de acesso: .
  • Flynn: SISD, SIMD, MISD e MIMD.
  • Lei de Amdahl: .

Pegadinhas

# Errado Certo
1 Von Neumann usa memórias separadas para instruções e dados. Von Neumann usa uma memória única. Memórias separadas são de Harvard.
2 Os computadores pessoais atuais são Harvard pura. Usam Harvard modificada: memória principal única e cache L1 dividida.
3 O PC guarda a instrução em execução. O PC guarda o endereço da próxima instrução. O IR guarda a instrução atual.
4 O RISC tem instruções de tamanho variável. O RISC tem instruções de tamanho fixo. O tamanho variável é do CISC.
5 Maior frequência de relógio sempre significa menor tempo de execução. O tempo depende também do número de instruções e do CPI.
6 O pipeline reduz o tempo de cada instrução. O pipeline aumenta a vazão. A latência de cada instrução não cai.
7 A previsão de desvio resolve o conflito de dados. A previsão de desvio trata o conflito de controle. O adiantamento trata o de dados.
8 O barramento de endereços é bidirecional. O barramento de endereços é unidirecional, da CPU para a memória.
9 A largura do barramento de dados define a memória máxima. A memória máxima depende das linhas de endereço: 2 elevado a n posições.
10 O PCI Express é um barramento paralelo compartilhado. O PCI Express é serial e ponto a ponto, formado por vias.
11 No mapeamento direto, o bloco pode ocupar qualquer linha da cache. No mapeamento direto, o bloco tem uma única linha. Qualquer linha é o totalmente associativo.
12 Com 4 núcleos, um programa sempre roda 4 vezes mais rápido. Pela lei de Amdahl, a parte sequencial limita o ganho.

Fontes e data

  • [1] Conhecimento consolidado de livro didático de organização e arquitetura de computadores (modelo de Von Neumann e de Harvard, ciclo de instrução, RISC e CISC, pipeline, barramentos, hierarquia de memória, cache, taxonomia de Flynn e lei de Amdahl).

Texto conferido em 15/10/2026.

Conferido em 15/10/2026.

Estude todos os tópicos do seu edital assim.

A assinatura custa R$ 50 por mês ou R$ 500 por ano. Você tem garantia de 7 dias.