{{ __('Painel do Aluno') }}











Ao se descreverem computadores, é comum se fazer uma distinção entre arquitetura de computadores e organização de computadores. Embora seja difícil estabelecer definições precisas para tais termos, existe um consenso a respeito das áreas que abra ngem cada um. Arquitetura de computador refere-se aos atributos de um sistema visíveis a um programador ou, em outras palavras, aqueles atributos que possuem um impacto direto sobre a execução lógica de um programa. Um termo que é muitas vezes usado de maneira intercambiável com as arquiteturas de computadores é arquitetura de conjunto de instrução (ISA - do inglês,Instruction Set Architecture). O ISA define os formatos de instruções, códigos de operação da instrução ( opcodes ), registradores, memória de dados e in strução; o efeito das instruções executadas nos registradores e na memória; e um algoritmo para o controle da execução das instruções. Organização de computador refere-se às unidades operacionais e suas interconexões que percebam as especificações de arquitetura. Os exemplos de atributos de arquitetura incluem o conjunto de instrução, o número de bits usados para representar vários tipos de dados (por exemplo, números, caracteres), mecanismos de EIS e técnicas para endereçamento de memória. Atributos organizacionais incluem os detalhes do hardware transparentes ao programador, como sinais de controle, interfaces entre o computador e periféricos e a tecnologia de memória utilizada. Por exemplo, é uma questão de projeto de arquitetura se um computador terá uma instrução de multiplicação. É uma questão de organização se essa instrução será implementada por uma unidade de multiplicação especial ou por um mecanismo que faça uso repetido da unidade de adição do sistema. A decisão organizacional pode ser baseada na previsão da frequência de uso da instrução de multiplicação, na velocidade relativa das duas técnicas e no custo e tamanho físico de uma unidade de multiplicação especial . Historicamente, e ainda hoje, a distinção entre arquitetura e organização tem sido importante. Muitos fabricantes de computador oferecem uma família de modelos de computador, todos com a mesma arquitetura, mas com diferenças na organização. Consequentemente, os diferentes modelos na família têm diferentes características de preço e desempenho. Além do mais, uma arquitetura em particular pode se espalhar por muitos anos e abranger diversos modelos diferentes de computador, com sua organização variando conforme a mudança da tecnologia. Um exemplo proeminente desses dois fenômenos é a arquitetura IBM System/370. Essa arquitetura foi introduzida pela primeira vez em 1970 e incluía diversos modelos. O cliente com requisitos modernos poderia comprar um modelo mais barato, mais lento e, se a demanda aumentasse, poderia atualizar mais tarde para um modelo mais caro e mais rápido, sem ter que abandonar o software desenvolvido. Com o passar dos anos, a IBM introduziu muitos novos modelos com tecnologia melhorada para substituir outros modelos, oferecendo ao cliente maior velocidade, menor custo ou ambos. Esses modelos mais novos mantinham a mesma arquitetura, de modo que o investimento de software do cliente fosse protegido. O interessante é que a arquitetura System/370, com algumas melhorias, sobreviveu até os dias de hoje como a arquitetura da linha de produtos de mainframe da IBM. Em uma classe de computadores chamada microcomputadores, o relacionamento entre arquitetura e organização é muito próximo. As mudanças na tecnologia não apenas influenciam a organização, mas também resultam na introdução de arquiteturas mais poderosas e mais complexas. Geralmente, há menor requisito para compatibilidade de geração a geração para essas máquinas menores. Assim, existe mais interação entre decisões de projeto organizacional e de arquitetura. Um exemplo intrigante disso é o computador com conju nto de instruções reduzido (RISC - do inglês, Reduced lnstruction Set Computer) que examinamos no Capítulo 15. Este livro examina a organização e a arquitetura do computador. A ênfase talvez seja mais no lado da organização. Porém, como uma organização de computador precisa ser projetada para implementar determinada especificação de arquitetura, um tratamento completo da organização exige um exame detalhado também da arquitetura.

Estrutura e Função

Um computador é um sistema complexo; computadores contemporâneos contêm milhões de componentes eletrônicos elementares. Como, então, alguém poderia descrevê-los com clareza? A chave é reconhecer a natureza hierárquica dos sistemas mais complexos, incluindo o computador (SIMON, 1996). Um sistema hierárquico é um conjunto de subsistemas inter-relacionados, cada um deles, por sua vez, hierárquico em estrutura até alcançarmos algum nível mais baixo de subsistema elementar. A natureza hierárquica dos sistemas complexos é essencial para seu projeto e sua descrição. O projetista só precisa lidar com um nível particular do sistema de cada vez. Em cada nível, o sistema consiste em um conjunto de componentes e suas inte r -relações. O comportamento em cada nível depende somente de uma caracterização simplificada e resumida do sistema, no próximo nível mais baixo. Em cada nível, o projetista está interessado na estrutura e na função:

► Estrutura: o modo como os componentes são inter-relacionados.

► Função: a operação individual de cada componente como parte da estrutura. Em termos de descrição, temos duas escolhas: começar de baixo e subir até uma descrição completa, ou começar com uma visão de cima e decompor o sistema em suas subpartes. A evidência de diversos campos sugere que a abordagem de cima para baixo (ou top-down) é a mais clara e mais eficaz (WEINBERG, 1975). A abordagem usada neste livro vem desse ponto de vista. O sistema de computador será descrito de cima para baixo. Começamos com os componentes principais de um computador, descrevendo sua estrutura e função, e prosseguimos para camadas sucessivamente mais baixas da hierarquia. O restante desta seção oferece uma visão geral muito breve desse plano de ataque.

Função



Tanto a estrutura quanto o funcionamento de um computador são, essencialmente, simples. Em termos gerais, há somente quatro funções básicas que podem ser apresentadas pelo computador: ► Processamento de dados: os dados podem ter uma grande variedade de formas, e a amplitude de exigências de processamento é grande. Contudo, devemos ver que há somente poucos métodos fundamentais ou tipos de processamento de dados.

► Armazenamento de dados: mesmo que o computador esteja processando dados na hora (isto é, os dados aparecem e são processados, e os resultados saem de imediato), o computador deve temporariamente armazenar pelo menos as peças de dados que estão sendo trabalhadas em um dado momento. Assim, há ao menos uma função de armazenamento de dados de curto prazo. Igualmente importante, o computador apresenta uma função de armazenamento de dados de longo prazo. Arquivos de dados são armazenados no computador para recuperação e atualização.

► Movimentação de dados: o ambiente operacional do computador consiste em dispositivos que servem como fontes ou destinos de dados. Quando dados são recebidos de ou entregues a um dispositivo que é diretamente conectado ao computador, o processo é conhecido como entrada-saída (E/S ou, do inglês, input- output - l/O ), e o dispositivo é referido como um periférico. Quando os dados são movimentados por longas distâncias, a ou de um dispositivo remoto, o processo é conhecido como comunicações de dados.

► Controle: dentro de um computador, uma unidade de controle gerencia os recursos do computador e orquestra o desempenho de suas partes funcionais na resposta às instruções.
A discussão precedente pode parecer absurdamente generalizada. Isto é certamente possível, mesmo em um nível alto de estrutura de computador, a fim de diferenciar uma variedade de funções, mas para citar Siewiorek, Bell e Newell (1982):
Notadamente, há poucas modelagens de estrutura de computador para servir a função a ser desempenhada. Na raiz disso reside a natureza do propósito geral dos computadores, na qual toda a especialização funcional ocorre no momento de programar, e não no momento de projetar.
Estrutura Agora, vamos dar uma olhada de modo geral na estrutura interna de um computador. Começamos com um computador tradicional com um processador único que emprega uma unidade de controle microprogramada, então examina uma estrutura multicore típica.




► Unidade central de processamento (CPU - do inglês, Central Processing Unit): controla a operação de um computador e realiza suas funções e processamento de dados; costuma ser referida simplesmente como processador.
► Memória principal: armazena dados.
► E/S: move dados entre o computador e seu ambiente externo.
► Sistema de interconexão: algum mecanismo que proporciona comunicação entre CPU, memória principal e E/S. Um exemplo comum de um sistema de interconexão é o barramento do sistema, que consiste em um número de fios condutores aos quais todos os outros componentes se conectam. Pode haver um ou mais de cada um dos componentes supracitados. Tradicionalmente, há apenas um único processador. Nos anos recentes, aumentou o uso de múltiplos processadores em um único computador. Algumas regras de projeto relacionadas a diversos processadores surgem de súbito e são discutidas conforme o andamento do texto; a Parte V foca nesses computadores. Cada um desses componentes pode ser examinado em algum detalhe na Parte II. Contudo, para nossos propósitos, o mais importante e, algumas vezes, o mais complexo componente é a CPU. Seus principais componentes estruturais são os seguintes:
► Unidade de controle: controla a operação da CPU e, portanto, do computador.
► Unidade lógica e aritmética (ALU - do inglês, Arithmetic and Logic Unit): executa as funções de processamento de dados do computador.
► Registradores: proporciona armazenagem interna na CPU.
► Interconexão da CPU: alguns mecanismos que proporcionam comunicação entre a unidade de controle, ALU e registradores. A Parte III trata desses componentes, e nela veremos que a complexidade é adicionada pelo uso de técnicas organizacionais paralelas e de pipeline. Por fim, há algumas técnicas para a implementação da unidade de controle; uma técnica comum é a implementação microprogramada. Em essência, uma unidade de controle microprogramada opera executando as microinstruções que definem a funcionalidade da unidade de controle. Com essa técnica, a estrutura da unidade de controle pode ser descrita. Essa estrutura é abordada na Parte IV. ESTRUTUR A DE COMPUTADOR MULTICORE Como mencionado, computadores contemporâneos em geral têm múltiplos processadores. Quando esses processadores todos residem em um único chip, o termo computador multicore é usado, e cada unidade de processamento (que consiste em uma unidade de controle, ALU, registradores e talvez cache) é chamada de core. Para esclarecer a terminologia, este texto usará as seguintes definições.
► Unidade central de processamento (CPU): é aquela parte do computador que busca e executa instruções. Consiste em uma ALU, uma unidade de controle e registradores. Em um sistema com uma única unidade de processamento, é referida simplesmente como processador.
► Core: é uma unidade de processamento individual em um chip de processador. Um core pode ser equivalente em funcionalidade a uma CPU em um sistema de CPU única. Outras unidades de processamento especializadas, como uma otimizada para operações de vetores ou de matrizes, são também referidas como cores.
► Processador: trata-se de um pedaço físico de silício que contém um ou mais cores. O processador é um componente do computador que interpreta e executa instruções. Se um processador contém múltiplos cores, ele é referido como um processador multicore.
Após cerca de uma década de discussão, há um amplo consenso da indústria a respeito desse uso. Outra característica proeminente de computadores contemporâneos é o uso de múltiplas camadas de memória, chamada de memória cache, entre o processador e a memória principal. O Capítulo 4 é dedicado à memória cache. Para os nossos propósitos nesta seção, simplesmente observamos que a memória cache é menor e mais rápida que a memória principal e é usada para deixar mais rápido o acesso da memória, ao colocar os dados na cache, a partir da memória principal, que provavelmente poderão ser usados em um futuro próximo. Um maior aprimoramento do desempenho pode ser obtido pelo uso de múltiplos níveis de cache, com o nível 1 (Ll), mais próximo do core, e os níveis adicionais (L2, L3 e daí por diante), progressivamente mais longe do core. Nesse esquema, o nível n é menor e mais rápido que o nível n + l. A maioria dos computadores, inclusive os computadores incorporados a smartphones e tablets, além dos computadores pessoais, laptops e estações de trabalho, é hospedada na placa-mãe. Antes de descrever essa disposição, é preciso definir alguns termos. Uma placa de circuito impresso (PCB - do inglês, Printed Circuit Board) é uma placa rígida e plana que mantém e interconecta chips e outros componentes eletrônicos. A placa é composta por camadas, geralmente de duas a dez, que interconectam os componentes por caminhos de cobre que são gravados na placa. A placa de circuito impresso principal em um computador é chamada de placa de sistema ou placa-mãe, ao passo que as menores que se conectam nas aberturas da placa principal são chamadas de placas de expansão. Os elementos mais proeminentes na placa-mãe são os chips. Um chip é um pedaço único de material semicondutor, em geral de silício, no qual os circuitos eletrônicos e portas lógicas são fabricados. O produto resultante é referido como um circuito integrado.




A placa-mãe contém um slot ou um soquete para o chip do processador, o que geralmente contém múltiplos cores individuais, que é conhecido como processador multicore. Há também slots para os chips da memória, chips de controlador EIS e outros componentes-chave do computador. Para computadores desktop, os slots de expansão permitem a inclusão de mais componentes na placa de expansão. Assim, uma placa-mãe moderna conecta somente poucos componentes individuais, com cada chip contendo de alguns milhares até centenas de milhões de transistores.

A figura acima mostra um chip de processador que contém oito cores e uma memória L3. Não é mostrada a lógica exigida para controlar operações entre os cores e a cache e entre os cores e o circuito externo na placa- mãe. A figura indica que a cache L3 ocupa duas porções distintas da superfície do chip. Contudo, geralmente, todos os cores têm acesso a toda a cache L3 por meio dos já mencionados circuitos de controle. O chip do processador mostrado não representa nenhum produto específico, mas proporciona uma ideia geral sobre como tais chips são dispostos.

Em seguida, daremos foco à estrutura de um único core, que ocupa a parte do chip do processador. Em linhas gerais, os elementos funcionais de um core são:

► Lógica de instrução: inclui as tarefas envolvidas em buscar instruções, e decodificar cada instrução a fim de determinar a operação de instrução e os locais de memória dos operandos.
► Unidade lógica e aritmética (ALU): executa a operação especificada por uma instrução. ► Lógica de load/store: gerencia a transferência de dados para e de uma memória principal através da cache.
O core também contém uma cache Ll, dividida entre uma cache de instrução (I-cache) que é usada para a transferência de instruções para e de uma memória principal, e uma cache de dados Ll, para a transferência de operandos e resultados. Geralmente, os chips de processador atuais também i ncluem uma cache L2 como parte do core. Em alguns casos, essa cache é também dividida entre instrução e caches de dados, embora uma cache L2 única e combinada também seja usada.
Tenha em mente que essa representação do layout do core visa somente dar uma ideia geral da estrutura interna do core. Em um dado produto, os elementos funcionais podem não ser dispostos como os três elementos distintos mostrados na Figura 1.2, sobretudo se algumas ou todas essas funções forem implementadas como parte de uma unidade de controle microprogramada. EXEMPLOS Será instrutivo considerar os exemplos do mundo real que ilustram a estrutura hierárquica dos computadores. A Figura 1.3 é uma fotografia da placa-mãe para um computador elaborado com dois chips de processador Intel Quad-Core Xeon. Alguns dos elementos marcados na fotografia são discutidos adiante neste livro. Aqui, mencionamos o mais i mportante, além dos soquetes do processador:
► Slots do PCI-express para adaptador de vídeo de alta qualidade e para periféricos adicionais (a Seção 3.6 descreve PCie).
► Controladores Ethernet e portas Ethernet para conexões de rede.
► Soquetes USB para dispositivos periféricos.
► Soquetes ATA Serial (SATA) para conexão com a memória de disco (a Seção 7.7 discute Ethernet, USB e SATA.
► Interfaces para chips de memória principal DDR (do inglês, Double Data Rate) - a Seção 5.3 discute DDR.
► O chipset Intel 3420 é um controlador EIS para operações de acesso direto à memória (DMA - do inglês, Direct Access Memory) entre dispositivos periféricos e a memória principal (a Seção 7.5 discute DMA). Seguindo nossa estratégia de cima para baixo, como ilustrado nas imagens, podemos agora focar e analisar a estrutura interna do chip do processador. Para variar, consideraremos o chip IBM, em vez do chip do processador Intel. A Figura 1.4 é uma fotografia de um chip de processador para o computador mainframe IBM zEnterprise EC12. Esse chip tem 2,75 bilhões de transistores. As marcas sobrepostas indicam como o silício está realmente alocado. Vemos que esse chip tem seis cores ou processadores. Além disso, há duas grandes áreas marcadas como cache L3, que são compartilhadas por seis processadores. A lógica de controle L3 controla o tráfego entre a cache L3 e os cores e entre a cache L3 e o ambiente externo. Além disso, há lógica de controle de armazenamento (CA) entre os cores e a cache L3. A função do controlador de memória (CM) é controlar o acesso à memória externamente ao chip. O barramento EIS GX controla a interface aos adaptadores de canal, acessando a EIS.




Descendo a um nível mais profundo, examinamos a estrutura interna de um único core, como mostrado na fotografia da imagem. Tenha em mente que essa é a parte da área de superfície de silício que compõe um chip de p rocessador único. As principais subáreas dentro dessa área do core são as seguintes:
► ISU (unidade de sequência de instrução - do inglês, Instruction Sequence Unit): determina a sequência na qual as instruções são executadas no que é referido como arquitetura superescalar.
► IFU (unidade de busca de instrução - do inglês,Instruction Fetch Unit): lógica para buscar instruções.
► IDU (unidade de decodificação de instrução - do inglês,Instruction Decode Unit): a IDU é alimentada por buffers IFU e é responsável por analisar e decodificar todos os opcodes dez/Arquitetura.




► LSU (unidade de load/store - do inglês, Load-Store Unit): a LSU contém uma cache de dados 96 kB Ll,1 e gerencia o tráfego de dados entre a cache de dados L2 e as unidades de execução funcionais. É responsável por lidar com todos os tipos de acessos de operandos de todas as extensões, modos e formatos, como definido na ?)Arquitetura.
► XU (unidade de tradução - do inglês, Translation Unit): essa unidade traduz os endereços lógicos a partir de instruções nos endereços físicos na memória principal. A XU também contém o TLB (Translation Lookaside Buffer) usado para incrementar o acesso da memória.
► FXU (unidade de ponto fixo - do inglês, Fixed Point Unit): a FXU executa as operações aritméticas de ponto fixo.
► BFU ( unidade de ponto flutuante binário - do inglês, Binary Floating-point Unit): a BFU lida com todas as operações de ponto flutuante binário e hexadecimal, bem como com operações de multiplicação de ponto fixo.
► DFU (unidade de ponto flutuante decimal - do inglês,Decimal Floating-point Unit): a DFU lida tanto com as operações de ponto fixo como com as de ponto flutuante sobre os números que são armazenados como dígitos decimais.
► RU (unidade de recuperação - do inglês,Recovery Unit): a RU mantém a cópia do estado completo do sistema que inclui todos os registradores, coleta sinais de falha de hardware e gerencia as ações de recuperação do hardware.
► COP (coprocessador dedicado - do inglês, Dedicated Co-Processor): o COP é responsável pela compressão de dados e funções de criptografia para cada core.
► 1-cache: esta é uma cache de instrução 64 kB L1 que permite que a IFU pré-busque instruções antes que sejam necessárias.
► Controle L2: esta é a lógica de controle que gerencia o tráfego através de duas caches L2.
► Dados-L2: trata-se de uma cache de dados 1 MB L2 para todo o tráfego de memória diferente das instruções.
► lnstr-L2: é uma cache de instrução 1 MB L2.
Conforme progredimos pelo livro, os conceitos introduzidos na seção vão se tornando claros.

A primeira geração: válvulas



A primeira geração de computadores usou válvulas para elementos lógicos digitais e memória. Uma série de pesquisas e computadores comerciais foram construídos com válvulas. Para nosso propósito, será instrutivo examinar talvez o mais famoso computador de primeira geração, conhecido como computador IAS. Uma técnica fundamental de projeto implementada em primeiro lugar no computador IAS é conhecida como conceito de programa armazenado. Essa ideia é geralmente atribuída ao matemático John von Neumann. Alan Turing desenvolveu a ideia ao mesmo tempo. A primeira publicação da ideia ocorreu em uma proposta em 1945, por von Neumann para um novo computador, o EDVAC (Electronic Discrete Variable Computer).3 Em 1946, von Neumann e seus colaboradores começaram a desenvolver um novo computador de programa armazenado, referido como computador IAS. IAS, embora não tenha sido finalizado até 1952, é o protótipo de todos os computadores de propósito geral subsequentes.4 Na Figura abaixo mostra a estrutura do computador IAS (em comparação com a Figura 1.1). Ela consiste em:
► Uma memória principal, que armazena tanto dados como instruções.5
► Uma unidade lógica e aritmética (ALU) capaz de operar os dados binários.
► Uma unidade de controle, que interpreta instruções que estão na memória e faz que sejam executadas.
► Equipamento de entrada/saída (EIS) controlado pela unidade de controle.



Essa estrutura é delineada na proposta antecedente de von Neumann (1945), que vale a pena citar neste ponto:

2.2 Primeiro: desde que o dispositivo seja primariamente um computador, ele terá de executar as operações elementares de aritmética de modo mais frequente. Elas consistem em adição, subtração, multiplicação e divisão. Portanto, é razoável que contenha unidades especializadas para essas operações.

Deve ser observado, contudo, que, enquanto esses princípios como tais são provavelmente adequados, a maneira específica como é realizada requer um exame minucioso. A qualquer custo uma parte aritmética central do dispositivo vai provavelmente ter de existir, e ela constitui a primeira parte específica: CA.

2.3 Segundo: o controle lógico do dispositivo, isto é, o sequenciamento adequado de suas operações, pode ser mais especificamente executado por uma unidade central de controle. Se o dispositivo for elástico, ou seja, o mais próximo possível para todos os propósitos, então deve ser feita uma diferenciação entre as instruções específicas dadas e a definição de um problema particular, e as unidades gerais de controle que verificam que essas instruções - não importa o que sejam - sejam realizadas. O primeiro deve ser armazenado de algum modo; os últimos são representados pelas partes de operação definitivas do dispositivo. Por controle central queremos dizer essa última função somente, e unidades que executam formam a segunda parte específica: CC.

2.4 Terceiro: qualquer dispositivo que for executar sequências longas e complicadas de operações (especificamente de cálculos) deve ter uma memória considerável.

As instruções que controlam um problema complicado podem necessitar de recursos materiais consideráveis, sobretudo se o código for circunstancial (como na maioria das vezes). Esse material deve ser guardado.

De qualquer forma, a memória total constitui a terceira parte específica do dispositivo: M.

2.6 As três partes específicas CA, CC (juntas a C) e M correspondem aos neurônios associativos do sistema nervoso humano. Resta discutir o equivalente dos neurônios sensórios ou aferentes e dos motores ou eferentes. Essas são as unidades de entrada e saída do dispositivo.

O dispositivo deve ser dotado da capacidade de manter o contato de entrada e saída (sensório e motor) com algum meio específico desses tipos. O meio será chamado de meio de gravação de saída do dispositivo: R.

2.7 Quarto: o dispositivo deve ter unidades para transferir informação a partir de R para as partes específicas C e M. Eles formam sua entrada, a quarta parte específica:!. Será visto que é melhor fazer todas as transferências de R (por I) dentro de M e nunca diretamente de C.

2.8 Quinto: o dispositivo deve ter unidades para transferir de suas partes específicas C e M dentro de R. Essas unidades formam sua saída, a quinta parte específica: O. Será visto que novamente é melhor fazer todas as transferências de M (por O) dentro de R, e nunca diretamente de C. Com raras exceções, todos os computadores de hoje têm essa mesma estrutura e função geral e são, por conseguinte, referidos como máquinas de von Neumann. Assim, neste ponto vale a pena descrever de modo breve a operação do computador IAS (BURKS; GOLDSTINE; NEUMANN, 1946 e GOLDSTINE; POMERENE; SMITH, 1954). Seguindo Hayes (1998), a terminologia e notação de von Neumann são mudadas em seguida para se adequar mais proximamente ao uso moderno; os exemplos que acompanham essa discussão são baseados no último texto.

A memória da IAS consiste em 4.096 locais de armazenamento, chamados de palavras, de 40 dígitos binários (bits) cada.6 Tanto os dados como as instruções são armazenados aqui. Os números são representados na forma binária, e cada instrução é um código binário. A Figura ilustra esses formatos. Cada número é representado pelo bit de sinal e por um valor de 39 bits. Uma palavra pode, por sua vez, conter duas instruções de 20 bits, com cada instrução consistindo em um opcode de 8 bits que especifica a operação a ser executada e um endereço de 12 bits designando uma das palavras na memória (numerada de O a 999).



A unidade de controle comanda o IAS buscando instruções a partir da memória e executando-as uma por vez. Explicamos essas operações com referência Essa figura revela que tanto a unidade de controle como a ALU contêm locais de armazenamento, chamados de registradores, definidos desta maneira:

► Registrador de buffer de memória (MBR): contém uma palavra a ser armazenada na memória ou enviada à unidade EIS ou é usado para receber uma palavra a partir da memória ou a partir da unidade EIS.
► Registrador de endereço de memória (MAR): especifica o endereço na memória da palavra a ser escrito a partir ou lido na MBR.
► Registrador de instruções (IR): contém o opcode de 8 bits, da instrução opcode que está sendo executada.
► Registrador de buffer de instrução (IBR): empregado para manter temporariamente a instrução da direita, da palavra da memória.
► Contador do programa (PC): contém o endereço do próximo par de instruções a ser buscado na memória.
► Acumulador (AC) e quociente-multiplicador (MQ): empregado para manter temporariamente os operandos e os resultados das operações da ALU. Por exemplo, o resultado da multiplicação de dois números de 40 bits é um número de 80 bits; os 40 bits mais significativos são armazenados no AC, e os menos significativos no MQ. O IAS opera executando repetidamente um ciclo de instrução, como mostrado na Figura 1.8. Cada ciclo de instrução consiste em dois subciclos. Durante o ciclo de busca, o opcode da instrução seguinte é carregado no IR e a parte do endereço é carregada no MAR. Essa instrução pode ser tomada a partir do IBR ou pode ser obtida a partir da memória ao carregar a palavra no MBR e em seguida armazenar no IBR IR e MAR. Por que esse rodeio? Essas operações são controladas por um circuito eletrônico e resultam no uso de caminhos de dados. Para simplificar os circuitos eletrônicos, há apenas um registrador que é usado a fim de especificar o endereço da memória para ler ou escrever e somente um registrador usado como fonte ou destino. Uma vez que o código de operação esteja no IR, o ciclo de execução é realizado. O circuito de controle interpreta o opcode e executa a instrução ao enviar os sinais de controle apropriados para fazer que os dados sejam movidos ou uma operação seja realizada pela ALU. O computador IAS tem um total de 21 instruções, que são listadas na Tabela 1.1. Elas podem ser agrupadas da seguinte maneira:
► Transferência de dados: move os dados entre a memória e os registradores da ALU ou entre dois registradores da ALU.
► Saltos incondicionais: em geral, a unidade de controle executa as instruções em sequência a partir da memória. Essa sequência pode ser mudada por uma instrução de salto, o que facilita as operações repetitivas.
► Saltos condicionais: a execução de um salto pode ser dependente de uma condição, permitindo assim pontos de decisão.
► Aritmética: operações desempenhadas pela ALU.
► Modificação do endereço: permite que os endereços sejam calculados na ALU e então inseridos nas instruções armazenadas na memória. Isso possibilita a um programa uma flexibilidade de endereçamento considerável.




Segunda Geração de Transistores

A primeira mudança principal no computador eletrônico vem com a substituição das válvulas pelo transistor. O transistor, que é menor, mais barato e gera menos calor do que a válvula, pode ser usado da mesma maneira que uma válvula para construir computadores. Ao contrário da válvula, que requer fios, placas de metal e cápsula de vidro, além de vácuo, o transistor é um dispositivo de estado sólido, feito de silício. O transistor foi inventado nos Bell Labs em 1947, e na década de 1950 houve uma revolução eletrônica. Foi só no final dessa década, no entanto, que computadores totalmente transistorizados estiveram comercialmente disponíveis. O uso de transistor define a segunda ge ração de computadores. Tornou-se amplamente aceito classificar os computadores em gerações com base na tecnologia nos fundamentos de hardware empregados (Tabela 1.2). Cada nova geração é caracterizada por maiores desempenhos de processamento, maior capacidade de memória e menor tamanho do que o anterior. Mas há também outras mudanças. A segunda geração viu uma introdução de unidades aritméticas e lógicas e unidades de controle, o uso de linguagem de programação de alto nível e a disponibilização dos softwares de sistema com o computador. Em termos gerais, o software de sistema proporcionou a capacidade de carregar programas, mover dados a periféricos e bibliotecas para executar computações comuns, similar ao que fazem os sistemas operacionais modernos, como Windows e Linux.



Será útil examinar um importante integrante da segunda geração: o IBM 7094 (BELL; NEWELL, 1971). A partir da introdução da série 700 em 1952 até a introdução do último integrante da série 7000 em 1964, essa linha de produtos da IBM foi submetida a uma evolução típica dos produtos de computador. Membros sucessivos da linha de produto mostraram maior desempenho, maior capacidade e/ou custos mais baixos. O tamanho da memória principal, em múltiplos de 210 palavras de 36 bits, cresceu de 2 k (1 k = 2 1º) para 32 k palavras,7 ao passo que o tempo para acessar uma palavra da memória, o tempo de ciclo de memória, caiu de 30 μ,s para 1,4 μ,s. A quantidade de opcodes cresceu de modestos 24 para 185. Também, durante o tempo de vida útil dessas séries de computadores, a velocidade relativa da CPU aumentou por um fator de 50. Os aumentos na velocidade são conseguidos ao melhorar os dispositivos eletrônicos (por exemplo, uma implementação de transistor é mais rápida que uma implementação de uma válvula) e circuitos mais complexos. Por exemplo, o IBM 7094 inclui um Registrador de Backup de Instrução, usado para armazenar a próxima i nstrução. A unidade de controle busca duas palavras adjacentes a partir da memória para uma busca de instruções. Exceto para a ocorrência de instrução de salto, que é relativamente pouco frequente (talvez 10 a 15 % ), isso significa que a unidade de controle tem de acessar a memória para uma instrução somente em metade dos ciclos de instrução. Essa pré-busca reduz de modo significativo o tempo de ciclo de instrução médio. A Figura 1.9 mostra uma configuração grande (muitos periféricos) para um IBM 7094, que é um integrante representativo de computadores de segunda geração. Algumas diferenças do computador IAS são dignas de nota. A mais importante delas é o uso de canais de dados. Um canal de dados é um módulo EIS independente com seu próprio processador e conjunto de instrução. Em um sistema computacional com esses dispositivos, a CPU não executa integralmente as instruções de EIS. Essas instruções são armazenadas em uma memória principal e são executadas por um processador de propósito especial do canal de dados. A CPU inicia uma transferência de EIS enviando um sinal de controle ao canal de dados, instruindo a executar uma sequência



de instruções em memória. O canal de dados executa suas tarefas independentemente da CPU e dos sinais da CPU até a operação ser concluída. Isso alivia a CPU de uma carga de processamento considerável. Outro recurso novo é o multiplexador, que é o ponto de concentração para os canais de dados, a CPU e a memória. O multiplexador escalona o acesso à memória da CPU e dos canais de dados, permitindo que esses dispositivos atuem de maneira independente. A terceira geração: circuitos integrados Um transistor isolado, autocontido, é chamado de componente discreto. Pelos anos 1950 e início dos anos 1960, o equipamento eletrônico era composto principalmente de componentes discretos - transistores, resistores, capacitores e assim por diante. Os componentes discretos eram fabricados separadamente, empacotados em seus próprios invólucros e soldados ou ligados em placas de circuito tipo masonite, que eram então instaladas nos computadores, osciloscópios e outros equipamentos eletrônicos. Sempre que um equipamento eletrônico exigia um transistor, um pequeno tubo de metal, contendo uma peça de silício do tamanho de uma cabeça de alfinete, tinha de ser soldado a uma placa de circuito. O processo de manufatura inteiro, do transistor à placa de circuito, era dispendioso e complicado. Esses fatos da vida estavam começando a criar problemas na indústria do computador. Os primeiros computadores de segunda geração continham cerca de 10.000 transistores. Esse número cresceu para centenas de milhares, tornando a fabricação de máquinas mais novas e mais poderosas cada vez mais difícil. Em 1958, chegou a realização que revolucionou a eletrônica e iniciou a era da microeletrônica: a invenção do circuito integrado, que define a terceira geração de computadores. Nesta seção, oferecemos uma breve introdução à tecnologia dos circuitos integrados. A seguir, examinamos talvez os dois membros mais importantes da terceira geração, ambos introduzidos no início dessa era: o IBM System/360 e o DEC PDP-8. MlCROELETRÔNICA Microeletrônica significa, literalmente, "pequena eletrônica': Desde os primórdios da eletrônica digital e da indústria da computação, tem havido uma tendência persistente e consistente quanto à redução no tamanho dos circuitos eletrônicos digitais. Antes de examinarmos as implicações e os benefícios dessa tendência, precisamos dizer algo sobre a natureza da eletrônica digital.

IBM SVSTEM/360 Por volta de 1964, a IBM tinha uma grande participação no mercado de computadores, com sua série de máquinas 7000. Nesse ano, a IBM anunciou o System/360, uma nova família de produtos de computador. Embora o anúncio em si não tenha sido surpresa, ele continha algumas notícias desagradáveis para os clientes da IBM: a linha de produtos 360 era incompatível com as máquinas IBM mais antigas. Assim, a transição para o 360 seria difícil para a base de clientes de então, mas a IBM sentiu que era necessário resolver algumas das restrições da arquitetura 7000 e produzir um sistema capaz de evoluir com a nova tecnologia de circuito integrado (PADEGS, 1981, GIFFORD; SPECTOR, 1987). A estratégia compensou financeira e tecnicamente. O 360 foi o sucesso da década e concretizou a IBM como o fornecedor dominante de computadores, com uma fatia de mercado de mais de 70%. E, com algumas modificações e extensões, a arquitetura do 360 permanece até hoje na arquitetura dos computadores mainframe9 da IBM. Exemplos usando essa arquitetura podem ser encontrados no decorrer deste texto. O System/360 foi a primeira família de computadores planejados do setor. A família cobria uma grande faixa de desempenho e custo. Os modelos são compatíveis quanto à capacidade de um programa escrito para um modelo ser executado por outro modelo da série, com apenas uma diferença no tempo que leva para ser executado.
O conceito de uma família de computadore s compatíveis foi moderno e extremamente bem-sucedido. Um cliente com requisitos modestos e um orçamento correspondente poderia começar com um Modelo 30 relativamente barato. Mais tarde, se as necessidades do cliente aumentassem, seria possível atualizar para uma máquina mais rápida com mais memória, sem sacrificar o investimento no software já desenvolvido. As características de uma família são as seguintes:

► Conjunto de i nstruções semelhante ou idêntico: em alguns casos, exatamente o mesmo conjunto de instruções de máquina é aceito em todos os membros da família. Assim, um programa que executa em uma máquina também será executado em qualquer outra. Em alguns casos, o extremo inferior da família tem um conjunto de instruções que é um subconjunto daquele do topo da família. Isso significa que os programas podem subir, mas não descer.

► Sistema operacional semelhante ou idêntico: o mesmo sistema operacional básico está disponível para todos os membros da família. Em alguns casos, recursos adicionais são acrescentados aos membros de mais alto nível.

► Maior velocidade: a taxa de execução de instruções aumenta, dos membros mais baixos aos mais altos da família.

► Número cada vez maior de portas de E/S: o número de portas de E/S aumenta, dos membros mais baixos aos mais altos da família.

► Aumento do tamanho de memória: o tamanho da memória principal aumenta, dos membros mais baixos aos mais altos da família.

► Maior custo: em determinado ponto no tempo, o custo de um sistema aumenta, dos membros mais baixos aos mais altos da família.

Como esse conceito de família poderia ser implementado? As diferenças foram conseguidas com base em três fatores: velocidade básica, tamanho e grau de simultaneidade (STEVENS, 1964). Por exemplo, velocidade maior na execução de determinada instrução poderia ser obtida pelo uso de um circuito mais complexo na ALU, permitindo a execução das suboperações em paralelo. Outra forma de aumentar a velocidade era aumentar a largura do caminho de dados entre a memória principal e a CPU. No Modelo 30, somente 1 byte (8 bits) poderia ser buscado na memória principal de cada vez, contra 8 bytes por vez no Modelo 75.

O System/360 não apenas ditou o curso futuro da IBM, mas também teve um impacto profundo sobre a indústria inteira. Muitos de seus recursos tornaram-se padrão de outros computadores grandes. DEC PDP-8 No mesmo ano que a IBM entregou o primeiro System/360, ocorreu outra primeira remessa importantíssima: o PDP-8, da Digital Equipment Corporation (DEC). Na época em que o computador padrão exigia uma sala com ar condicionado, o PDP-8 (apelidado de minicomputador pelo setor, em referência à minissaia, da época) era pequeno o suficiente para poder ser colocado sobre uma bancada de laboratório ou embarcado em outro equipamento. Ele não podia fazer tudo o que o mainframe fazia, mas a US$ 16 .000, ele era barato o suficiente para que cada técnico de laboratório tivesse um. Ao contrário, a série de computadores mainframe System/360, introduzida apenas alguns meses antes, custava centenas de milhares de dólares.

O baixo custo e o pequeno tamanho do PDP-8 permitiram que outro fabricante adquirisse um PDP-8 e o integrasse a um sistema para revenda. Esses outros fabricantes passaram a ser conhecidos como fabricantes de equipamento original (OEMs - em inglês, Original Equipment Manufacturers), e o mercado de OEM tornou- se e continua a ser um segmento importante do mercado de computadores. Ao contrário da arquitetura de chaveamento central usada pela IBM em seus sistemas 700/7000 e 360, os modelos mais recentes do PDP-8 usavam uma estrutura que agora é praticamente universal para microcomputadores: a estrutura de barramento. Ela é ilustrada na Figura. O barramento do PDP-8, chamado Omnibus, consiste em 96 caminhos de sinal separados, usados para transportar sinais de controle, endereço e dados. Como todos os componentes do sistema compartilham um conjunto comum de caminhos de sinal, seu uso precisa ser controlado pela CPU. Essa arquitetura é altamente flexível, permitindo que os módulos sejam conectados ao barramento para criar várias configurações. Somente nos anos recentes é que a estrutura de barramento tem dado forma a uma estrutura conhecida como interconexão ponto a ponto, descrita.

Gerações posteriores



Além da terceira geração, existe pouco consenso geral sobre a definição das gerações de computadores. A Tabela sugere ter havido diversas gerações posteriores, com base nos avanços na tecnologia de circuito integrado. Com a introdução da integração em grande escala (LSI), mais de 1.000 componentes podem ser colocados em um único chip de circuito integrado. A integração em escala muito grande (VLSI - do inglês, Very-Large-Scale lntegration) alcançou mais de 10.000 componentes por chip, enquanto os chips com integração em escala ultragrande (ULSI - do inglês, Ultra-Large-Scale Integration) podem conter mais de um bilhão de componentes. Com o rápido ritmo da tecnologia, a alta taxa de introdução de novos produtos e a importância do software e das comunicações, além do hardware, a classificação por geração torna-se menos clara e menos significativa. Nesta seção, mencionamos dois dos mais importantes desses resultados. MEMÓRIA SEMICONDUTORA A primeira aplicação da tecnologia de circuito integrado aos computadores foi a construção do processador (a unidade de controle e a unidade lógica e aritmética) em chips de circuito integrado. Mas também se descobriu que essa mesma tecnologia poderia ser usada para construir memórias.



Evolução da Arquitetura Intel X86

As propostas dos x86 atuais representam os resultados de décadas de esforço de projeto em computadores com conjunto complexo de instruções (CISC - do inglês, Complex Instruction Set Computers). O x86 atual incorpora os sofisticados princípios de projeto antigamente encontrados apenas em mainframes e supercomputadores e serve como um excelente exemplo de projeto CISC. Uma técnica alternativa para o projeto do processador é o computador com conjunto de instruções reduzido (RISC - do inglês, Reduced Instruction Set Computers). A arquitetura ARM é usada em uma grande variedade de sistemas embarcados e é um dos sistemas baseados em RISC mais poderosos e bem projetados no mercado. Nesta seção e na seguinte, oferecemos uma rápida visão geral desses dois sistemas.
Em termos de fatia de mercado, a Intel é considerada, há décadas, o fabricante número um de microprocessadores para sistemas não embarcados, uma posição da qual parece improvável recuar. A evolução de seu principal produto microprocessador serve como um bom indicador da tecnologia de computador em geral. A Tabela 1.3 mostra essa evolução. É interessante que, à medida que os microprocessadores se tornaram mais rápidos e muito mais complexos, a Intel realmente acelerou o ritmo. A Intel costumava desenvolver microprocessadores, um após o outro, a cada quatro anos, mas agora espera manter os concorrentes acuados, retirando um ou dois anos desse tempo de desenvolvimento,como tem feito com a maioria das gerações recentes do x86.10 Vale a pena listar alguns dos destaques da evolução da linha de produtos da Intel:
► 8080: o primeiro microprocessador de propósito geral do mundo. Esta era uma máquina de 8 bits, com um caminho de dados de 8 bits para a memória. O 8080 foi usado no primeiro computador pessoal, o Altair.
► 8086: uma máquina muito mais poderosa, de 16 bits. Além de um caminho de dados mais largo e registradores maiores, o 8086 ostentava uma cache de instruções, ou fila, que fazia a pré-busca de algumas instruções antes que fossem executadas. Uma variante desse processador, o 8088, foi usado no primeiro computador pessoal da IBM, assegurando o sucesso da Intel. O 8086 é o primeiro aparecimento da arquitetura x86.
► 80286: esta extensão do 8086 permitia o endereçamento de uma memória de 16 MB, em vez de apenas 1 MB. ► 80386: a primeira máquina de 32 bits da Intel e uma maior reformulação geral do produto. Com uma arquitetura de 32 bits, o 80386 competia em complexidade e potência com os minicomputadores e mainframes introduzidos alguns anos antes. Este foi o primeiro processador da Intel a aceitar multitarefa, significando que poderia executar vários programas ao mesmo tempo.
► 80486: o 80486 introduziu o uso de tecnologia de cache muito mais sofisticada e poderosa, bem como pipeline sofisticado de instrução. O 80486 também ofereceu um coprocessador matemático embarcado, tirando da CPU principal operações matemáticas complexas.
► Pentium: com o Pentium, a Intel introduziu o uso de técnicas superescalares, que permitem que múltiplas instruções sejam executadas em paralelo.
► Pentium Pro: o Pentium Pro continuou o movimento em direção à organização superescalar, iniciada com o Pentium, com o uso agressivo de renomeação de registrador, previsão de desvio, análise de fluxo de dados e execução especulativa.
► Pentium II: o Pentium II incorporou a tecnologia Intel MMX, que foi projetada especificamente para processar dados de vídeo, áudio e gráfico de forma eficiente.
► Pentium III: o Pentium III incorpora instruções de ponto flutuante adicionais: a extensão de conjunto de instrução T he Streaming SIMD Extensions (SSE) adicionou 70 novas instruções projetadas para aumentar o desempenho quando exatamente as mesmas operações estiverem para ser executadas em objetos de dados múltiplos. O processamento de sinal digital e o processamento gráfico são aplicações típicas.

► Pentium 4: o Pentium 4 inclui ponto flutuante adicional e outras melhorias para multimídia.
► Core: este é o primeiro microprocessador Intel x86 com um dual core, referindo-se à implementação de dois cores em um único chip.
► Core 2: o Core 2 estende a arquitetura para 64 bits. O Core 2 Quad oferece quatro processadores em um único chip. As ofertas mais recentes de Core têm até 10 cores por chip. O conjunto de instrução Advanced Vector Extensions foi um importante incremento, que ofereceu um conjunto de instruções para processamento eficiente de vetores de dados de 2 56 bits, e, então, de 512 bits.
Mais de 40 anos após sua introdução em 1978, a arquitetura x86 continua a dominar o mercado de processadores fora dos sistemas embarcados. Embora a organização e a tecnologia das máquinas x86 tenham mudado drasticamente durante as décadas, a arquitetura do conjunto de instruções evoluiu para permanecer compatível com versões anteriores. Assim, qualquer programa escrito em uma versão mais antiga da arquitetura x86 pode ser executado nas versões mais novas. Todas as mudanças na arquitetura do conjunto de instruções envolveram acréscimos ao conjunto de instruções, sem eliminação de instruções. A taxa de mudança tem sido o acréscimo de aproximadamente uma instrução por mês acrescentada à arquitetura (ANTHES, 2008), de modo que existem agora milhares de instruções no conjunto de instruções.
O x86 oferece uma excelente ilustração dos avanços em hardware de computador durante os últimos 35 anos. O 8086 de 1978 foi introduzido com uma velocidade de clock de 5 MHz e tinha 29.000 transistores. Um Core i7 EE 4960X, de seis cores, introduzido em 2013, opera a 4 GHz, um ganho de velocidade com um fator de 800, e tem 1,86 bilhão de transistores, cerca de 64.000 vezes a quantidade do 8086. Ainda assim, o Core i7 EE 4960X tem um invólucro ligeiramente maior que o 8086 e tem um custo compatível.

Evolução da ARM



A ARM é uma família de RISC baseada em microprocessadores e microcontroladores desenvolvidos pela ARM Holdings, de Cambridge, na Inglaterra. A empresa não faz processadores, mas, em vez disso, desenvolve microprocessador e arquitetura multicore, licenciando-os aos fabricantes. Especificamente, a ARM Holdings tem dois tipos de produtos licenciáveis: processadores e arquitetura de processador. Para processadores, o consumidor compra os direitos de usar o modelo fornecido da ARM em seus próprios chips. Para uma arquitetura de processador, o consumidor compra os direitos de desenvolver seu próprio processador compatível com a arquitetura ARM. Os chips ARM são processadores de alta velocidade que são conhecidos pelo pequeno tamanho do die (pequeno pedaço de silício onde um circuito é implementado) e pelo baixo consumo de energia. Eles são amplamente usados em smartphones e em outros dispositivos hand-held, inclusive sistemas de jogos, bem como uma grande variedade de produtos de consumo. Os chips ARM são os processadores dos populares dispositivos Apple, o iPod e o iPhone, e são usados em praticamente todos os smartphones Android. A ARM é provavelmente a arquitetura de processador embarcado mais amplamente usada e de fato a arquitetura de processador mais usada de qualquer tipo no mundo (YANCIE, 2014) . As origens da tecnologia ARM podem ser remetidas à empresa Acorn Computers, baseada na Grã-Bretanha. No início da década de 1980, a Acorn firmou um contrato com a British Broadcasting Corporation (BBC) a fim de desenvolver uma nova arquitetura de microcomputador para o Projeto de Alfabetização Digital da BBC. O sucesso desse contrato possibilitou à Acorn continuar a desenvolver o primeiro processador comercial RISC, o Acorn RISC Machine (ARM).A primeira versão,ARMl, começou a operar em 1985 e foi usada para pesquisa e desenvolvimento interno, além de ser usada como um coprocessador na máquina da BBC. No estágio inicial, a Acorn usou a empresa YLSI Technology para de fato fazer a fabricação dos chips dos processadores. A YLSI era licenciada para comercializar o chip por conta própria e teve algum sucesso fazendo outras empresas usarem o ARM em seus produtos, particularmente como um processador embarcado. O projeto ARM combinou com uma necessidade comercial crescente por um processador de alto desempenho, baixo consumo de energia, pequeno tamanho e baixo custo para aplicações embarcadas. Mas o desenvolvimento além disso estava fora do escopo das capacidades da Acorn. Consequentemente, uma nova empresa foi organizada, com Acorn, YLSI e Apple Computer como parceiros fundadores, conhecida como ARM.


Arquitetura do conjunto de instrução O conjunto de instruções ARM é altamente regular, desenvolvido para a implementação eficiente do processador e para a execução eficaz. Todas as instruções são de 32 bits e seguem o formato regular. Isso faz com que o ARM ISA seja adaptável para a implementação em uma grande variedade de produtos. O conjunto de instruções Thumb aumenta o ARM ISA básico, que é um subconjunto recodificado do conjunto de instrução ARM. O Thumb é desenvolvido para aumentar o desempenho das implementações de ARM que usam um barramento de dados de memória de 16 bits ou mais estreito e permite melhor densidade de código que a proporcionada pelo conjunto de instrução ARM. O conjunto de instruções Thumb contém um subconjunto do conjunto de instruções ARM de 32 bits recodificadas para instruções de 16 bits. A versão atual definida é a Thumb-2. Produtos ARM A ARM Holdings licencia um número de microprocessadores especializados e relacionados às tecnologias, mas a maior parte de sua linha de produtos é a família das arquiteturas de microprocessadores Cortex. Há três arquiteturas Cortex, convenientemente denominadas pelas iniciais A, R e M.

CORTEX-A/CORTEX-A50 O Cortex-A e Cortex-AS0 são processadores de aplicações direcionados a dispositivos móveis tais como os smartphones e os leitores de eBook, bem como dispositivos de consumo tais como TV digital e gateways residenciais (por exemplo, DSL e modems de internet a cabo). Esses processadores executam em uma frequência alta de clock (acima de 1 GHz) e suportam uma unidade de gerenciamento de memória (MMU - em inglês, Memory Management Unit), que é necessária para todos os recursos dos SOs, como Linux,Android, MS Windows e SOs para dispositivos móveis. Uma MMU consiste em um módulo de hardware que suporta memória virtual e paginação ao traduzir endereços virtuais em endereços físicos; esse assunto é explorado no Capítulo 8.

As duas arquiteturas usam tanto os conjuntos de instruções do ARM como o do Thumb-2; a principal diferença é que o Cortex-A é um equipamento de 32 bits e o Cortex-AS0 é de 64 bits. CORTEX-R O Cortex-R é desenvolvido para suportar aplicações em tempo real, em que a temporização de eventos precisa ser controlada com resposta rápida a estes eventos. Eles podem executar em uma frequência de clock elevada (por exemplo, 200 MHz a 800 MHz) e ter uma latência de resposta muito baixa. O Cortex-R inclui acréscimos tanto do conjunto de instruções como da organização do processador a fim de suportar os dispositivos fortemente embarcados de tempo real.

A maioria desses processadores não tem MMU; as exigências de dados limitados e os números limitados de processos simultâneos eliminam a necessidade de elaborar apoio de hardware e software para a memória virtual. O Cortex-R não tem uma Unidade de Proteção de Memória (MPU - do inglês, Memory Protection Unit), cache e outras características de memória desenvolvidas para as aplicações industriais.

Uma MPU é um módulo de hardware que proíbe que um programa na memória acesse acidentalmente uma parte da memória atribuída a outro programa ativo. Ao usar vários métodos, uma barreira de proteção é criada ao redor do programa, e as instruções dentro delas são proibidas de referenciar dados do lado de fora desta barreira.

Exemplos de sistemas embarcados que usariam o Cortex-R são os freios ABS (Automotive Braking Systems), controladores de armazenamento de massa e dispositivos de impressão e de rede. CORTEX-M Os processadores da série Cortex-M foram desenvolvidos primeiro para o domínio dos microcontroladores, em que a necessidade de gerenciamento rápido, de interrupções altamente determinísticas, está aliada ao desejo por um número extremamente baixo de portas e um consumo de energia mais baixo possível. Com a série Cortex-R, a arquitetura Cortex-M tem uma MPU, mas não uma MMU. O Cortex-M usa somente o conjunto de instrução Thumb-2. O mercado para o Cortex-M inclui dispositivos de IoT, redes de sensores/atuadores sem fio usadas em fábricas e outros tipos de empresas, partes eletrônicas, etc. Existem, atualmente, quatro versões da série Cortex-M:

► Cortex-MO: desenvolvido para aplicações de 8 e 16 bits, esse modelo enfatiza os baixos custos, potência ultrabaixa e simplicidade. É otimizado para pequenos dies de silício (começando a partir de 12k portas) e utiliza chips de custos mais baixos.

► Cortex-MO+: uma versão melhorada do MO, que é mais eficiente quanto ao uso de energia.

► Cortex-M3: desenvolvido para aplicações de 16 e 32 bits, esse modelo enfatiza o desempenho e a eficiência do uso de energia. Ele também tem funcionalidades abrangentes de depuração e trace a fim de possibilitar que os desenvolvedores de software projetem suas aplicações mais rapidamente.

► Cortex-M4: esse modelo proporciona todas as características do Cortex-M3, com instruções adicionais para suportar as tarefas de processamento de sinal digital. Neste texto, em primeiro lugar, usamos a ARM Cortex-M3 como nosso exemplo de processador de sistema embarcado. É mais bem adaptado para todos os modelos ARM de microcontroladores de uso geral. O Cortex-M3 é usado por uma variedade de produtos de microcontroladores. Os dispositivos microcontroladores iniciais dos principais parceiros já combinam o processador Cortex-M3 com flash, SRAM e diversos periféricos a fim de proporcionar uma oferta competitiva ao preço de apenas US$ 1.



Velocidade do microprocessador



O que dá aos processadores Intel x86 ou computadores mainframe da IBM essa potência incrível é a busca implacável de velocidade pelos fabricantes de chip de processador. A evolução dessas máquinas continua a comprovar a lei de Moore, mencionada no Capítulo 1. Como essa lei sustenta, os fabricantes de chips podem desencadear uma nova geração de chips a cada três anos - com quatro vezes a quantidade de transistores. Em chips de memória, isso quadruplicou a capacidade da memória de acesso aleatório e dinâmico (ORAM - do inglês, Dynamic Random Access Memory), ainda a tecnologia básica para a memória principal, a cada três anos. Nos microprocessadores, a adição de novos circuitos, e o aumento de velocidade que vem da redução das distâncias entre eles, melhorou o desempenho de 4 a 5 vezes a cada três anos ou mais desde que a Intel lançou sua família x86 em 1978.
Mas a velocidade básica do microprocessador não alcança seu potencial, a menos que receba um fluxo constante de trabalho para fazer na forma de instruções de computador. Qualquer coisa que atrapalhe esse fluxo suave mina a potência do processador. Consequentemente, enquanto os fabricantes de chips estiverem ocupados aprendendo a fabricar chips com densidade cada vez maior, os projetistas de processadores deverão aparecer com técnicas ainda mais elaboradas para alimentar o monstro. Entre as técnicas embutidas nos processadores contemporâneos estão as seguintes:

► Realização de pipeline: a execução de uma instrução envolve uma série de operações, como buscar a instrução, decodificar as diversas partes do código de operação ( opcode ), buscar operandos, realizar cálculos e assim por diante. Utilizar o pipeline possibilita que um processador trabalhe simultaneamente em diversas instruções ao executar uma fase diferente de cada instrução ao mesmo tempo. O processador sobrepõe as operações ao mover os dados ou instruções em um pipe conceituai com todos os estágios do pipe processando simultaneamente. Por exemplo, enquanto uma instrução está sendo executada, o computador está decodificando a instrução seguinte. Esse é o mesmo princípio visto em uma linha de montagem.

► Predição de desvio: o processador antecipa o código de instrução buscado a partir da memória e prediz quais desvios ou grupos de instruções provavelmente serão processados a seguir. Se o processador prediz certo a maior parte do tempo, ele pode pré-buscar as instruções corretas e agrupá-las, de modo que seja mantido ocupado. Os exemplos mais sofisticados dessa estratégia predizem não somente o próximo desvio, mas diversos desvios à frente. Assim, a predição dos desvios potencialmente aumenta a quantidade de trabalho disponível para o processador executar.

► Execução superescalar: é a capacidade de enviar mais de uma instrução em todos os ciclos de clock de processador. Em efeito, diversos pipelines paralelos são usados.

► Análise de fluxo de dados: o processador analisa quais instruções são dependentes dos resultados, ou dados, umas das outras, a fim de criar uma lista otimizada de instruções. De fato, as instruções são listadas para serem executadas quando prontas, independentemente do pedido do programa original. Isso previne atrasos desnecessários.

► Execução especulativa: usando a previsão de desvio e a análise do fluxo de dados, alguns processadores especulativamente executam instruções antes de seu surgimento real na execução do programa, mantendo os resultados em locais temporários. Isso permite que o processador mantenha seus mecanismos de execução ocupados o máximo possível, executando instruções que provavelmente serão necessárias. Estas e outras técnicas sofisticadas tornam-se necessárias pela capacidade completa do processador. Coletivamente, elas fazem com que seja possível explorar a velocidade básica do processador, em vez de levar alguns ciclos por instrução.

Estas e outras técnicas sofisticadas tornam-se necessárias pela capacidade completa do processador.

Coletivamente, elas fazem com que seja possível explorar a velocidade básica do processador, em vez de levar alguns ciclos por instrução. Balanço do desempenho Embora a capacidade de processamento do processador tenha crescido em uma velocidade espantosa, outros componentes críticos do computador não a acompanharam. O resultado é a necessidade de procurar o balanço do desempenho: um ajuste da organização e da arquitetura para compensar a diferença entre as capacidades dos diversos componentes.

O problema criado por essas diferenças é particularmente importante na interface entre o processador e a memória principal. Embora a velocidade do processador tenha aumentado rapidamente, a velocidade com que os dados podem ser transferidos entre a memória principal e o processador ficou para trás. A interface entre o processador e a memória principal é o caminho mais crítico no computador inteiro, pois é responsável por transportar um fluxo constante de instruções do programa e de dados entre os chips de memória e o processador. Se a memória ou o caminho deixar de manter o desempenho com as demandas insistentes do processador, este entra em um estado de espera, e perde-se um tempo valioso de processamento.

Existem várias maneiras de um arquiteto de sistemas atacar esse problema, todas refletidas nos projetos atuais de computador. Considere os seguintes exemplos:
► Aumentar o número de bits que são recuperados ao mesmo tempo, tornando a DRAM "mais larga" em vez de "mais profunda" e usando caminhos de dados largos no barramento.
► Alterar a interface da DRAM para torná-la mais eficiente, incluindo uma cache 1 ou outro esquema de buffering no chip de DRAM.
► Reduzir a frequência de acesso à memória incorporando estruturas de cache cada vez mais complexas e eficientes entre o processador e a memória principal. Isso inclui a incorporação de uma ou mais caches no chip do processador, bem como uma cache fora do chip, próxima ao chip do processador.
► Aumentar a largura de banda de interconexão entre os processadores e a memória usando barramentos de velocidade mais alta e usando uma hierarquia de barramentos para armazenar e estruturar o fluxo de dados. Outra área de foco de projeto é o tratamento dos dispositivos de EIS. À medida que os computadores se tornam mais rápidos e mais capazes, aplicações mais sofisticadas são desenvolvidas para dar suporte ao uso de periféricos com demandas intensas de EIS. A Figura 2.1 mostra alguns exemplos de dispositivos periféricos típicos em uso nos computadores pessoais e nas estações de trabalho. Esses dispositivos criam demandas consideráveis de fluxo de dados. Embora a geração atual de processadores possa tratar os dados enviados por esses dispositivos, ainda resta o problema de movimentar esses dados entre o processador e o periférico. As estratégias aqui incluem esquemas de caching e buffering, mais o uso de barramentos de interconexão de maior velocidade e estruturas de barramentos mais elaboradas. Além disso, o uso de configurações de múltiplos processadores pode auxiliar a satisfazer as demandas de EIS. A chave em tudo isso é o equilíbrio. Os projetistas constantemente lutam para equilibrar as demandas de fluxo e processamento dos componentes do processador, memória principal, dispositivos de EIS e estruturas de interconexão. Esse projeto precisa ser constantemente repensado para lidar com dois fatores em constante evolução:
► A taxa em que o desempenho está mudando nas diversas áreas da tecnologia (processador, barramentos, memória, periféricos) difere bastante de um tipo de elemento para outro.
► Novas aplicações e novos dispositivos periféricos constantemente mudam a natureza da demanda sobre o sistema em termos do perfil de instrução típico e dos padrões de acesso aos dados. Assim, o projeto do computador é uma forma de arte em constante evolução. Este livro tenta apresentar os fundamentos nos quais essa forma de arte é baseada e uma análise do estado atual dela.

<

Melhorias na organização e na arquitetura do chip



À medida que os projetistas lutam com o desafio de balancear o desempenho do processador com o da memória principal e de outros componentes do computador, permanece a necessidade de aumentar a velocidade do processador. Para isso, existem três técnicas:

► Aumentar a velocidade de hardware do processador. Esse aumento deve-se fundamentalmente à diminuição do tamanho das portas lógicas no chip do processador, de modo que mais portas possam ser alocadas mais próximas uma das outras, aumentando a frequência do clock. Com portas mais próximas, o tempo de propagação para os sinais é significativamente reduzido, permitindo um aumento de velocidade do processador. Um aumento na frequência do clock significa que operações individuais são executadas mais rapidamente.

► Aumentar o tamanho e a velocidade das caches interpostas entre o processador e a memória principal. Em particular, dedicando uma parte do próprio chip do processador à cache, os tempos de acesso à cache caem significativamente.

► Fazer mudanças na organização e na arquitetura do processador, que aumentam a velocidade efetiva da execução da instrução. Tipicamente, isso envolve o uso do paralelismo de uma forma ou de outra. Tradicionalmente, o fator dominante nos ganhos de desempenho tem sido em aumentos na velocidade do clock e densidade lógica. Contudo, à medida que a velocidade do clock e a densidade lógica aumentam, diversos obstáculos tornam-se mais significativos (INTEL. .. , 2004):

► Potência: à medida que a densidade da lógica e a velocidade do clock em um chip aumentam, também aumenta a densidade de potência (Watts/cm2). A dificuldade de dissipar o calor gerado em chips de alta densidade e alta velocidade está se tornando um sério problema de projeto (GIBBS, 2004, BORKAR, 2003).

► Atraso de RC: a velocidade com que os elétrons podem se movimentar em um chip entre os transistores é limitada pela resistência e capacitância dos fios de metal que os conectam; especificamente, o atraso aumenta à medida que o produto RC aumenta. À medida que os componentes no chip diminuem de tamanho, as interconexões de fios tornam-se mais finas, aumentando a resistência. Além disso, os fios estão mais próximos, aumentando a capacitância.

► Latência e taxa de transferência da memória: a velocidade de acesso à memória (latência) e a taxa de transferência limitam as velocidades do processador, conforme já foi discutido. Assim, haverá mais ênfase nas abordagens de organização e arquitetura para melhorar o desempenho. Essas técnicas são discutidas em outros capítulos do livro. A partir do final da década de 1980, e continuando por cerca de quinze anos, duas estratégias principais foram utilizadas para aumentar o desempenho além do que pode ser alcançado simplesmente aumentando a velocidade do clock. P rimeiro, houve um aumento na capacidade da cache. Agora, existem em geral dois ou três níveis de cache entre o processador e a memória principal. À medida que a densidade do chip tem aumentado, mais da memória cache tem sido incorporada no chip, permitindo um acesso mais rápido a ela. Por exemplo, o chip Pentium original dedicava cerca de 10% da área do chip a uma cache. Os chips atuais dedicam mais da metade de sua área a caches. E, geralmente, cerca de três quartos da outra metade são para controle e buffering relacionados ao pipeline. Segundo, a lógica de execução de instrução dentro de um processador tornou-se cada vez mais complexa para permitir a execução paralela das instruções dentro do processador. Duas técnicas de projeto dignas de nota são: pipeline e superescalar. Um pipeline funciona como uma linha de montagem em uma fábrica, permitindo que diferentes estágios de execução de instruções distintas ocorram ao mesmo tempo pelo pipeline. A técnica superescalar basicamente permite múltiplos pipelines dentro de um único processador, de modo que as instruções que não dependem umas das outras possam ser executadas em paralelo.
Em meados dos anos de 1990, essas duas técnicas estavam atingindo o ponto de diminuir os retornos. A organização interna dos processadores atuais é excessivamente complexa e capaz de lidar com a distribuição do paralelismo do fluxo de instruções. Parece provável que aumentos mais significativos nessa direção serão relativamente modestos (GIBBS, 2004). Com três níveis de cache no chip do processador, cada um oferecendo capacidade substancial, também parece que os benefícios da cache estejam chegando a um limite. Porém, simplesmente contar com o aumento na frequência do clock para aumentar o desempenho faz com que nos deparemos com o problema de dissipação de potência já citado. Quanto maior a frequência do clock, maior a potência a ser dissipada, sem falar que alguns limites físicos fundamentais já estão sendo atingidos.



Lei de Amdahl

Os desenvolvedores de sistema computacional procuram modos de aprimorar o desempenho do sistema por meio de avanços na tecnologia ou mudanças no desenvolvimento. Exemplos incluem o uso de processadores paralelos, o uso de hierarquia de memória cache, speedup no tempo de acesso de memória e taxa de transferência de E/S em razão de melhorias na tecnologia. Em todos esses casos, é importante notar que um speedup em um aspecto da tecnologia ou desenvolvimento não resulta em um correspondente aumento do desempenho. Essa limitação se expressa de modo sucinto pela lei de Amdahl. A lei de Amdahl foi proposta primeiro por Gene Amdahl em 1967 (AMDAHL, 1967, 2013) e lida com o potencial speedup de um programa usando múltiplos processadores em comparação com um único processador. Considere um programa sendo executado em um único processador de modo que uma fração (1 - f) do tempo de execução envolve o código, que é inerentemente sequencial , e uma fração f que envolve o código que é infinitamente paralelizável sem sobrecarga no escalonamento. Considere que T é o tempo de execução total do programa que usa um único processador. Então, o speedup mediante o uso de um processador paralelo com N processadores que exploram completamente a parte paralela do programa

Lei de Little

A Lei de Little é um teorema fundamental na teoria das filas, criado por John D.C. Little na década de 1960. De forma simplificada, ela estabelece uma relação direta entre três métricas-chave em qualquer sistema onde há um fluxo de itens (sejam eles clientes, tarefas, produtos, etc.) através de um processo:

Medidas Básicas de Desempenho do Computador



Na avaliação do hardware do processador e na definição de requisitos para novos sistemas, o desempenho é um dos principais parâmetros a se considerar, juntamente com custo, tamanho, segurança, confiabilidade e, em alguns casos, consumo de potência.

É difícil fazer comparações de desempenho significativas entre diferentes processadores, mesmo entre os processadores na mesma família. A velocidade é muito menos importante do que como um processador funciona quando executa determinada aplicação. Infelizmente, o desempenho da aplicação depende não apenas da velocidade do processador, mas do conjunto de instruções, da escolha da linguagem de implementação, da eficiência do compilador e da habilidade da programação feita para implementar a aplicação.

Começamos esta seção com uma visão de algumas medidas tradicionais de velocidade do processador. Na próxinrn seção, estudaremos o benchmarking, que é a técnica mais comum para avaliar o processador e o desempenho do sistema computacional. Na seção seguinte, discutiremos como medir os resultados a partir dos testes múltiplos.

Velocidade de clock



As operações realizadas por um processador, como busca e decodificação de uma instrução, realização de uma operação aritmética e assim por diante, são controladas por um clock do sistema. Normalmente, todas as operações começam com o pulso do clock. Assim, no nível mais fundamental, a velocidade de um processador é ditada pela frequência de pulso produzida pelo clock, medida em ciclos por segundo, ou Hertz (Hz). Geralmente, os sinais de clock são gerados por um cristal de quartzo, que gera uma onda de sinal constante enquanto uma tensão é aplicada. Essa onda é convertida em um stream de pulsos de voltagem digital, que é fornecido em um fluxo constante aos circuitos do processador. Por exemplo, um processador de 1 GHz recebe 1 bilhão de pulsos por segundo. A taxa de pulsos é conhecida como frequência do clock ou velocidade de clock. Um incremento ( ou pulso) do clock é conhecido como um ciclo de clock ou um período do clock. O tempo entre os pulsos é o tempo de ciclo.

A frequência do clock não é arbitrária, mas precisa ser apropriada para o layout físico do processador. As ações no processador exigem que os sinais sejam enviados de um elemento do processador para outro. Quando um sinal é colocado em uma linha dentro do processador, é preciso alguma quantidade finita de tempo para os níveis de voltagem se estabilizarem, de modo que um valor preciso (1 ou O lógicos) esteja disponível. Além do mais, dependendo do layout físico dos circuitos do processador, alguns sinais podem mudar mais rapidamente do que outros. Assim, as operações precisam ser sincronizadas e cadenciadas de modo que valores de sinal elétrico (voltagem) apropriados estejam disponíveis para cada operação.

A execução de uma instrução envolve uma série de etapas discretas, como buscar a instrução na memória, decodificar as diversas partes da instrução, carregar e armazenar dados e realizar operações aritméticas e lógicas. Assim, grande parte das instruções na maioria dos processadores requer múltiplos ciclos de clock para ser executada. Algumas instruções podem usar apenas alguns ciclos, enquanto outras exigem dezenas. Além disso, quando o pipeline é usado, múltiplas instruções são executadas simultaneamente. Assim, uma comparação direta das velocidades de clock em diferentes processadores não diz muito sobre o desempenho.




Benchmarks da SPEC



A necessidade comum nas comunidades industrial, acadêmica e de pesquisa para medidas de desempenho de computador geralmente aceitas tem levado ao desenvolvimento de pacotes de benchmark padronizados. Um pacote de benchrnark é uma coleção de programas, definidos em uma linguagem de alto nível, que,juntos, tentam oferecer um teste representativo de um computador em determinada área de aplicação ou de programação de sistema. O mais conhecido conjunto de pacotes de benchmark é definido e mantido pela Standard Performance Evaluation Corporation (SPEC), um consórcio da indústria.

Essa organização define vários pacotes que visam à avaliação dos sistemas computacionais. As medidas de desempenho SPEC são bastante usadas para fins de comparação e pesquisa. O pacote de benchmark mais conhecido da SPEC é o SPEC CPU2006. Trata-se do pacote padrão da indústria para aplicações com uso intensivo do processador. Ou seja , o SPEC CPU2006 é apropriado para medir o desempenho de aplicações que gastam a maior parte de seu tempo realizando cálculos, em vez de E/S. Outros pacotes SPEC são os seguintes:

► SPECviewperf: padrão para medir o desempenho de gráficos 3D com base em aplicações profissionais. ► SPECwpc: benchmark para medir todos os aspectos-chave do desempenho da estação de trabalho com base em diversas aplicações profissionais, incluindo mídia e entretenimento, desenvolvimento de produtos, ciências da vida, serviços financeiros e energia. ► SPECjvm2008: visa avaliar o desempenho do hardware combinado e os aspectos do software da plataforma de cliente Java Virtual Machine (JVM).

► SPECjbb2013 (Java Business Benchmark): um benchmark para avaliar as aplicações de e-commerce de servidor baseadas em Java .

► SPECsfs2008: desenvolvido para avaliar a velocidade e as capacidades de solicitação de manuseio dos servidores de arquivo.

► SPECvirt_sc2013: avaliação de desempenho de servidores de data centers usados na consolidação de v i r tualização d e servidores. Medidas d e desempenho d e ponta a ponta d e todos o s componentes d e sistema, incluindo hardware, plataforma de visualização, sistema operacional hospedeiro virtualizado e software de aplicação. O benchmark suporta a visualização do hardware, a visualização do sistema operacional e os esquemas de particionamento de hardware. O pacote CPU2006 é baseado em aplicações existentes que já foram utilizadas em uma grande variedade de plataformas pelos membros do setor SPEC. Para que os resultados do benchmark sejam confiáveis e realistas, os benchmarks da CPU2006 são delineados a partir de aplicações de vida real, em vez de usarem programas com Ioops artificiais ou benchmarks sintéticos. O pacote consiste em 12 benchmarks inteiros escritos em C e C++, e em 17 benchmarks de ponto flutuante escritos em C, C++ e Fortran (tabelas 2.5 e 2.6). O pacote contém mais de 3 milhões de linhas de código. Essa é a quinta geração dos pacotes de processadores intensivos da SPEC, substituindo SPEC CPU2000, SPEC CPU95, SPEC CPU92 e SPEC CPU89 (HENNING, 2007).

Para entender melhor os resultados publicados de um sistema usando CPU2006, definimos os seguintes termos usados na documentação da SPEC:

► Benchmark: um programa escrito em uma linguagem de alto nível que pode ser compilado e executado em qualquer computador que implemente o compilador.

► Sistema em teste: é o sistema a ser avaliado.

► Máquina de referência: é um sistema usado pela SPEC a fim de estabelecer o desempenho base para todos os benchmarks. Cada benchmark é executado e medido em sua máquina para estabelecer o tempo de referência para tal benchmark. Um sistema em teste é avaliado pela execução de benchmarks da CPU2006 e pela comparação dos resultados com a execução dos mesmos programas na máquina de referência.

► Métrica de base: é exigida para todos os resultados relatados e tem diretrizes estritas para compilação. Essencialmente, o compilador padrão com mais ou menos configurações padrão deve ser usado em cada sistema em teste para atingir resultados comparativos.

► Métrica de pico: possibilita aos usuários tentar otimizar o desempenho do sistema ao otimizar a saída do compilador. Por exemplo, diferentes opções de compilador podem ser usadas em cada benchmark, e é permitida a otimização direcionada pelo feedback.

► Métrica de velocidade: é simplesmente uma medida do tempo que leva para a execução de um benchmark compilado. A métrica de velocidade é usada para se comparar a capacidade do computador de completar tarefas simples.

► Métrica de taxa: é uma medida de quantas tarefas um computador pode cumprir em certa quantidade de tempo; isso é chamado de taxa de transferência, capacidade ou medida de taxa. A métrica de taxa permite que o sistema em teste execute tarefas simultâneas para levar vantagem dos múltiplos processadores.

A SPEC usa o histórico sistema Sun, o "Ultra Enterprise 2'; que foi apresentado em 1997, como a máquina de referência. A máquina de referência usa um processador 296-MHz UltraSPARC II.

Leva cerca de 12 dias para fazer uma execução de conformidade de regra das métricas base para C INT2006 e CFP2006 na máquina de referência da CPU2006. As tabelas 2.5 e 2.6 mostram a quantidade de tempo para executar um benchmark usando uma máquina de referência. As tabelas também mostram os números de instruções dinâmicas na máquina de referência, como relatado por Phanslkar, Joshi e John (2007).

Esses valores são o número atual de instruções realizadas durante a execução de cada programa. Agora, consideremos os cálculos específicos que são feitos na avaliação de um sistema. Consideremos os benchmarks inteiros; os mesmos procedimentos são usados para criar um valor de benchmark de ponto flutuante. Para os benchmarks inteiros, há 12 programas no pacote de teste. O cálculo é um processo de três etapas:

1. A primeira etapa na avaliação de um sistema em teste é compilar e executar cada programa no sistema três vezes. Para cada programa, o tempo de execução é medido e o valor médio é selecionado. A razão de usar três execuções e pegar o valor médio é para considerar as variações no tempo de execução que não




é intrínseco ao programa, como as variações de tempo de acesso de disco, e as variações de execução do núcleo do SO a partir de uma para outra execução. 2. Em seguida, cada um dos 12 resultados é normalizado ao se calcular a razão do tempo de execução de referência com o tempo de execução do sistema. Essa razão é calculada da seguinte maneira: r= Tref; ' Tsut; (2.9) em que Tref; é o tempo de execução do programa de benchmark i no sistema de referência e Tsut; é o tempo de execução do programa de benchmark i no sistema em teste. Desse modo, as razões são maiores para máquinas mais rápidas. 3. Por fim, a média geométrica de 12 razões de tempo de execução é calculada para descobrir a métrica geral: ( 12 )1/12 rc = ITr; i=l Para benchmarks inteiros, quatro métricas diferentes podem ser calculadas: ► SPECint2006: a média geométrica de 12 razões normalizadas quando os benchmarks são compilados com ajuste de pico. ► SPECint_base2006: a média geométrica de 12 razões normalizadas quando os benchmarks são compilados com ajuste de base. ► SPECint_rate2006: a média geométrica de 12 razões de taxa de transferência normalizadas quando os benchmarks são compilados com ajuste de pico. ► SPECint_rate_base2006: a média geométrica de 12 razões de taxa de transferência normalizada quando os benchmarks são compilados com sintonização de base.