terça-feira, 5 de abril de 2011

Como funcionam os microprocessadores


Introdução de Como funcionam os microprocessadores


O computador no qual você está lendo esta página utiliza um microprocessador para fazer este trabalho. O microprocessador é o coração de qualquer computador normal, seja um computador de mesa, seja um servidor, seja um laptop. Possivelmente a marca do seu processador é Intel ou AMD, e o tipo, Atom, Core 2 Duo, Celeron, Phenon, Turyon ou Athlon. Todos fazem praticamente a mesma coisa de maneira bastante semelhante.


Chip 4004, o primeiro processador do mundo, criado pela Intel
Um microprocessador (também conhecido como CPU ou unidade central de processamento) é uma máquina completa de computação embutida em um único chip. O primeiro microprocessador foi o Intel 4004, lançado em 1971. O i4004 não era muito poderoso, já que ele só podia somar e subtrair 4 bits por vez. Mesmo assim, era incrível ver tudo isso em um único chip naquela época. Antes do 4004, os engenheiros construíram computadores com vários chips (transistores ligados um a um). O 4004 foi utilizado em uma das primeiras calculadoras eletrônicas portáteis (que, na verdade eram um trambolhão).
Você já se perguntou o que o microprocessador do seu computador faz? Você sabe as diferenças entre os tipos de microprocessadores? Neste artigo, vai compreender como as técnicas simples de lógica digital permitem que o computador realize o seu trabalho, seja jogando, seja verificando a ortografia de um documento. 



evolução dos microprocessadores

O que é um chip?
Um chip também é chamado de circuito integrado. Geralmente é um pequeno e fino pedaço de silício no qual os transistores, que formam o microprocessador, foram encapsulados. Um chip do tamanho de uma polegada pode conter dezenas de milhões de transistores. Os processadores simples são formados por milhares de transistores encapsulados em um chip cuja área não passa de alguns milímetros quadrados.
O primeiro microprocessador utilizado em um computador pessoal foi o Intel 8080. Ele era um computador de 8 bits completo dentro de um chip e foi lançado em 1974; mas o primeiro microprocessador que se tornou realmente popular foi o Intel 8088, lançado em 1979 e incorporado a um PC IBM - que apareceu em 1982. Se você está familiarizado com a história e o mercado de PCs, vai se lembrar da evolução dos processadores. O 8088 evoluiu para o 80286, depois para o 80386, 80486, Pentium, Pentium II, Pentium III e Pentium 4, Celeron, Xeon, Itanium, Core, Core Duo, Quad... Todos estes microprocessadores foram produzidos pela Intel e são melhorias do design básico do 8088. Isso falando só de Intel. Seu principal concorrente, a AMD, evoluiu paralelamente, com o 286A, o 386, 486, 586, K5, K6-3, Athlon, Duron, Sempron, Athlon MX, AMD64, Phenom e Turion.

Um pouco de história
A maioria dos computadores existentes no mercado vem com processador Intel ou AMD. As duas empresas, rivais neste mercado desde meados da década de 90, oferecem várias linhas de processadores, como Core, Pentium, Celeron e Atom, da Intel,  e Turion, Sempron, Phenom e Athlon, da AMD. Cada uma dessas linhas é voltada para uma tipo de máquina e um tipo de público.

Fundada em 1968 pelos norte-americanos Gordon Moore e Robert Noyce, a Intel (sigla de Integrated Electronics) começou fabricando memórias para computadores de grande porte  antes de entrar no mercado de microprocessadores (o primeiro processador Intel foi feito para calaculadoras digitais da Texas Instruments). Quarenta anos depois, a empresa domina o mercado, produzindo processadores específicos para notebooks e desktops. Para notebooks, a Intel produz as linhas Core2 Duo e Core2 Solo, que têm dois núcleos de processamento e baixo consumo de energia graças à tecnologia de fabricação de 65 nm (nanometros) e 45 nm, e Core Solo e Core Duo, processador com um único núcleo fabricado em 65 nm.

Criada em 1969 para atender às necessidades da Intel – produzir chip de memória para a empresa de Mooore e Noyce – a Advanced Micro Device resolveu fabricar sua própria linha de produtos e concorrer com o ex-cliente. Apesar de estar mais centrada na produção de processadores para desktops, a empresa também tem suas linhas para notebooks, fabricadas com tecnologias de 65 nm (Turion X2 Ultra e Mobile Sempron) e 90 nm (Turion64 X2).

Recentemente, os processadores Intel ganharam uma nova família, a Core i7, baseada na arquitetura Nehalem, com novo desenho interno do processador e fabricação de 45 nm. O que coloca o i7 no topo da cadeia dos processadores é a quantidade de transistores existentes em uma microárea de 263 nanometros quadrados – são 731 milhões. Para se ter uma idéia, o top de linha da AMD, o Phenom, tem 463 milhões de transistores em uma área de 283 nanometros quadrados. Com tudo isso de transistor nesse espaço minúsculo, os i7 são poderosos e podem simular até 8 núcleos ao mesmo tempo – o dobro do número real.

A tabela a seguir vai ajudar você a entender as diferenças entre os processadores que a Intel lançou nos últimos anos.
Nome
Data
Transistores
Mícrons
Velocidade do clock
Largura de dados
MIPS
8080
1974
6.000
6
2 MHz
8 bits
0,64
8088
1979
29.000
3
5 MHz
16 bits
8 bits
0,33
80286
1982
134.000
1,5
6 MHz
16 bits
1
80386
1985
275.000
1,5
16 MHz
32 bits
5
80486
1989
1.200.000
1
25 MHz
32 bits
20
Pentium
1993
3.100.000
0,8
60 MHz
32 bits
64 bits
100
Pentium II
1997
7.500.000
0,35
233 MHz
32 bits
64 bits
300
Pentium III
1999
9.500.000
0,25
450 MHz
32 bits
64 bits
510
Pentium 4
2000
42.000.000
0,18
1,5 GHz
32 bits
64 bits
1,700
Pentium 4 "Prescott"
2004
125.000.000
0,09
3,6 GHz
32 bits
64 bits
7,000
Pentium D
2005
230.000.000
90nm
2,8 GHz
3,2 GHz
32 bits

Core2
2006
152.000.000
65nm
1,33
2,33 GHz
32 bits
26,000
Core 2 Duo
2007
820.000.000
45nm
3 GHz
64 bits
53,000
Core i7
2008
731.000.000
45nm
2,66 GHz
3,2 GHz
64 bits
76,000
 Informações sobre esta tabela
  • A data é o ano em que o processador foi lançado. Muitos processadores são relançados com maiores velocidades de clock anos depois do lançamento original.
  • Transistores é o número de transístores no chip. Nos últimos anos, o número de transistores em um chip cresceu bastante.
  • Mícrons é a largura, em mícrons, do menor fio do chip. Para você ter uma idéia, o fio de cabelo humano tem a espessura de 100 mícrons. Os chips diminuem de tamanho e o número de transistores aumenta.
  • Velocidade do clock é a taxa máxima do clock do chip. A velocidade do clock será explicada na próxima seção.
  • Largura de dados é a largura da Unidade Lógico-Aritmética (ALU). Uma ALU de 8 bits pode somar/subtrair/multiplicar/etc dois números de 8 bits. Uma ALU de 32-bit pode manipular números de 32 bits. Uma ALU de 8 bits teria que executar quatro instruções para somar dois números de 32 bits, enquanto que uma ALU de 32 bits precisa de apenas uma instrução. Em muitos casos, o barramento externo de dados é da mesma largura que a ALU. O 8088 tinha uma ALU de 16 bits e um barramento de 8 bits. Os cips mais recentes buscam dados de 64 bits de uma vez para as suas ALUs de 32 bits.
A partir dessa tabela, você pode perceber que existe uma relação entre a velocidade do clock e o MIPS. A velocidade máxima do clock é uma função do processo de fabricação e dos atrasos internos. Também existe uma relação entre o número de transistores e o MIPS. Por exemplo, o 8088 tinha um clock de 5 MHz, mas tinha MIPS de 0,33 (cerca de uma instrução para cada 15 ciclos do clock). Os processadores modernos executam milhões instruções por ciclo. Essa melhoria está diretamente relacionada ao número de transistores no chip. Vamos falar sobre isso na próxima seção.


 
A Lógica do microprocessador

Foto cedida por Intel Corporation
Processador Intel Pentium 4

Para entender o funcionamento de um microprocessador, vamos entender a lógica utilizada para se criar um. Neste processo, você também vai aprender um pouco de linguagem assembly (a língua nativa de um microprocessador) e muitas outras coisas que os engenheiros fazem para aumentar a velocidade do computador.
Um microprocessador executa uma série de instruções de máquina que dizem a ele o que fazer. As três funções básicas de um processador são:
  • utilizando sua ALU (Unidade Lógico-Aritmética), o microprocessador pode executar operações matemáticas como adição, subtração, multiplicação e divisão. Os microprocessadores modernos contêm processadores de ponto flutuante que podem executar operações extremamente sofisticadas com número grandes em pontos flutuantes;
  • um microprocessador pode mover dados de um endereço de memória para outro;
  • um microprocessador pode tomar decisões e desviar para um outro conjunto de instruções baseado nestas decisões.
O microprocessador pode fazer coisas muito complicadas, mas as três atividades citadas acima são as suas principais ações. O diagrama a seguir mostra um microprocessador extremamente simples que é capaz de fazer estas três coisas: 

Este microprocessador simples possui:
  • um barramento de endereços (pode ser de 8, 16 ou 32 bits) que envia um endereço para a memória;
  • um barramento de dados (pode ser de 8, 16 ou 32 bits) que envia e recebe dados da memória;
  • uma linha RD (Read ou Leitura) e WR (Write ou Escrita) que diz à memória se ela deve gravar ou ler o conteúdo da posição de memória endereçada;
  • um sinal de clock que fornece uma seqüência de pulsos de relógio para o processador;
  • um sinal de reset que reinicia o contador do programa para zero (ou outro valor) e recomeça a execução do programa.
Vamos supor que os barramentos de endereços e de dados tenham 8 bits neste exemplo. Os componentes deste microprocessador simples são:
  • os registradores A, B e C são simples latches simples formados de flip-flops (para obter mais informações, consulte a seção sobre "latches disparados por borda", em Como funciona a lógica booleana;
  • o latch de endereços é igual aos registradores A, B e C;
  • o contador do programa é um latch com as habilidades extras de incrementar de 1, quando solicitado e de ser zerado, quando solicitado;
  • a ALU pode ser um simples somador de 8 bits (para obter mais informações, consulte a seção sobre somadores em Como funciona a lógica booleana) ou pode somar, subtrair, multiplicar e dividir valores de 8 bits. Vamos supor que ela faça parte do segundo grupo;
  • oregistrador de teste é um latch especial que armazena valores das comparações realizadas na ALU. A ALU pode comparar dois números e determinar se eles são iguais ou se um é maior do que o outro. O registrador de teste também pode armazenar um bit de carry (carry-out) do último estágio do somador. Ele armazena esses valores em flip-flops e o decodificador de instruções pode usar os valores para tomar decisões;
  • existem seis caixas no diagrama com a indicação "3-state". Estes são os buffers tri-state. Um buffer tri-state pode deixar passar 1, 0 ou pode se desconectar da saída (imagine uma chave que se desconecta totalmente da linha de saída). Um buffer tri-state permite múltiplas saídas conectadas a um fio, mas somente uma delas leva 1 ou 0 para a linha;
  • o registrador de instrução e o decodificador de instrução são responsáveis pelo controle de todos os outros componentes.
Artigos úteis
Se você pouco sabe a respeito da lógica digital, leia os artigos a seguir para entender melhor esta seção:
Você não vê neste diagrama, mas existem linhas de controle do decodificador de instruções que:
  • mandam o registrador A colocar o seu valor atual no barramento de dados;
  • mandam o registrador B colocar o seu valor atual no barramento de dados;
  • mandam o registrador C armazenar o valor atual da sáida da ALU;
  • mandam o registrador de contador de programa colocar o valor atual no barramento de dados;
  • mandam o registrador de endereços travar o seu valor atual no barramento de dados;
  • mandam o registrador de instrução colocar o seu valor atual no barramento de dados;
  • mandam o contador de programa incrementar;
  • mandam o contador de programa resetar (ir para zero);
  • ativam qualquer um dos seis buffers tri-state (seis linhas separadas);
  • informam a ULA sobre qual operação ela deve executar;
  • mandam o registrador de teste armazenar os bits de teste da ULA;
  • ativam a linha RD;
  • ativam a linha WR. 


   

A memória do microprocessador

Na página anterior falamos sobre endereçamentos e barramentos de dados, assim como as linhas RD e WR. Esses barramentos e linhas se conectam com as memórias RAM e ROM. No nosso microprocessador de exemplo, nós temos um barramento de endereços de 8 bits e um barramento de dados de 8 bits. Isso significa que o microprocessador pode endereçar (28) 256 bytes de memória e ler ou escrever 8 bits da memória por vez. Vamos supor que este microprocessador simples tenha 128 bytes de ROM que começa no endereço 0 e 128 bytes de RAM que começa no endereço 128.





Memória ROM
ROM significa memória apenas para leitura (read-only memory). Um chip ROM é programado com uma coleção permanente de bytes pré-definidos. O barramento de endereçamento diz ao chip ROM qual byte pegar e colocar no barramento da dados. Quando a linha RD muda o estado, o chip ROM apresenta o byte selecionado ao barramento de dados.

Memória RAM
RAM significa memória de acesso aleatório (random access memory). A memória RAM contém bytes de informação e o microprocessador pode ler ou escrever nestes bytes, dependendo da linha de comando utilizada: RD ou WR. Um dos problemas dos chips RAM é que eles esquecem tudo uma vez que a energia é desligada. É por isso que o computador precisa de ROM.
Todos os computadores têm alguma memória ROM, e é possível criar um computador simples que não tenha memória RAM. Muitos microcontroladores fazem isso, colocando um pouco de memória RAM no próprio chip do processador. Porém, é impossível criar um computador que não tenha memória ROM. Em um PC, a memória ROM é conhecida como BIOS (sistema básico de entrada/saída). Quando um microprocessador começa a funcionar, ele executa primeiro as instruções contidas na BIOS. As instruções  da BIOS realizam testes no hardware e depois vão para o disco rígido para buscar o boot sector (para obter mais informações, consulte Como funcionam os discos rígidos). O boot sector é outro pequeno programa e a BIOS o armazena na RAM depois de lê-lo no disco. O microprocessador então começa a executar as instruções do boot sector a partir da memória RAM. O programa de boot sector manda o microprocessador copiar algo mais do disco rígido para a memória RAM, que o microprocessador executa posteriormente. Esta é a maneira pela qual o microprocessador carrega e executa todo o sistema operacional.





As instruções do microprocessador

Mesmo o mais simples dos microprocessadores pode executar uma grande variedade de instruções. As instruções são implementadas como padrões binários; cada uma delas significa algo diferente quando são carregadas pelo registrador de instruções. Como pessoas não são tão boas em lembrar padrões binários, um conjunto de pequenas palavras foi definido para representar os diferentes padrões binários. Esta coleção de palavras é conhecida como a linguagem assembly do processador. Um assembler (montador) pode traduzir as palavras para o seu padrão binário e a informação de saída do assembler é alocada na memória para ser executada pelo microprocessador.
Aqui está uma série de instruções assembly que um projetista poderia criar para este microprocessador simples:
  • LOADB mem - carrega o registrador B do endereçamento de memória
  • CONB con - carrega um valor constante no registrador B
  • SAVEB mem - armazena o registrador B no endereçamento de memória
  • SAVEC mem - armazena o registrador C no endereçamento de memória
  • ADD - soma A com B e armazena o resultado em C
  • SUB - subtrai A de B e armazena o resultado em C
  • MUL - multiplica A por B e armazena o resulado em C
  • DIV - divide A por B e armazena o resultado em C
  • COM - compara A com B e armazena o resultado no registrador teste
  • JUMP addr - desvia para um endereçamento
  • JEQ addr - desvia, se igual, para o endereçamento
  • JNEQ addr - desvia, se não igual, para o endereçamento
  • JG addr - desvia, se maior que, para o endereçamento
  • JGE addr - desvia, se maior que ou igual, para o endereçamento
  • JL addr - desvia, se menor que, para o endereçamento
  • JLE addr - desvia, se menor que ou igual, para o endereçamento
  • STOP - pára a execução
  • LOADA mem - carrega o registrador A do endereçamento de memória
Se você leu o artigo Como funciona a programação em C você sabe que este pequeno código em C vai calcular o fatorial de 5 (onde o fatorial de 5 = 5! = 5 * 4 * 3 * 2 * 1 = 120):
   a=1;

   f=1;   

   while (a <= 5)   

   {

        f = f * a;       

        a = a + 1;   

   }   
Ao fim da execução do programa, a variável f conterá o fatorial de 5.
Linguagem Assembly
Um compilador C traduz o código em C para a linguagem assembly. Se considerarmos que a RAM começa no endereço 128 deste processador e a ROM (que contém o programa em linguagem assembly) começa no endereçamento 0, então a linguagem do nosso simples microprocessador seria assim:

   // Suponha que a está no endereçamento 128

   // Suponha que f está no endereçamento 129

   0   CONB 1      // a=1;

   1   SAVEB 128

   2   CONB 1      // f=1;

   3   SAVEB 129

   4   LOADA 128   // if a > 5 desvia para  17

   5  CONB 5

   6   COM

   7   JG 17

   8   LOADA 129   // f=f*a;

   9   LOADB 128

   10  MUL

   11  SAVEC 129

   12  LOADA 128   // a=a+1;

   13  CONB 1

   14  ADD

   15  SAVEC 128

   16  JUMP 4       // volta para o if

   17  STOP   
Memória ROM
Agora vem a pergunta: "Como essas instruções vão ser exibidas na ROM?" Cada uma dessas instruções de linguagem assembly tem de ser representadas por um número binário. Para simplificar as coisas, vamos supor que cada instrução de linguagem assembly equivale a um único número:

  • LOADA - 1
  • LOADB - 2
  • CONB - 3
  • SAVEB - 4
  • SAVEC mem - 5
  • ADD - 6
  • SUB - 7
  • MUL - 8
  • DIV - 9
  • COM - 10
  • JUMP addr - 11
  • JEQ addr - 12
  • JNEQ addr - 13
  • JG addr - 14
  • JGE addr - 15
  • JL addr - 16
  • JLE addr - 17
  • STOP - 18
Esses números são conhecidos como opcodes (códigos de operação). Na ROM, nosso pequeno programa estaria assim:
   // Suponha que a está no endereçamento 128

   // Suponha que f está no endereçamento 129

   Addr opcode/value

   0    3             // CONB 1

   1    1   

   2    4             // SAVEB 128

   3    128

   4    3             // CONB 1

   5    1

   6    4             // SAVEB 129

   7    129

   8    1             // LOADA 128

   9    128

   10   3             // CONB 5

   11   5

   12   10            // COM

   13   14            // JG 17

   14   31

   15   1             // LOADA 129

   16   129

   17   2             // LOADB 128

   18   128

   19   8             // MUL

   20   5             // SAVEC 129

   21   129

   22   1             // LOADA 128

   23   128

   24   3             // CONB 1

   25   1

   26   6             // ADD

   27   5             // SAVEC 128

   28   128

   29   11            // JUMP 4

   30   8

   31   18            // STOP   
Como você pode ver, sete linhas de código em C se transformaram em 18 linhas de linguagem assembly e isso se transforma em 32 bytes na ROM.
Decodificação
O decodificador de instrução precisa transformar cada um dos opcodes em um conjunto de sinais que guiam os diferentes componentes dentro do microprocessador. Vamos pegar a instrução ADD como exemplo e ver o que ela precisa fazer.

  1. Durante o primeiro ciclo do clock, nós precisamos carregar a instrução; depois, o decodificador de instrução precisa:
    • ativar o buffer tri-state para o contador de programa;
    • ativar a linha RD;
    • ativar a entrada de dados no buffer tri-state;
    • armazenar a instrução no registrador de instruções;
  2. Durante o segundo ciclo do clock, a instrução ADD é decodificada. Não é necessário muito trabalho:
    • configure a operação do ULA para adição;
    • trave a saída do ULA no registrador C;
  3. Durante o terceiro ciclo de clock, o contador de programa é incrementado (em teoria, esse processo poderia estar acontecendo ao mesmo tempo que o segundo ciclo).
Cada instrução pode ser separada em um conjunto de operações em seqüência, como essas. Elas manipulam os componentes do microprocessador na ordem adequada. Algumas instruções, como a ADD, podem levar dois ou três ciclos de clock, outras podem durar cinco ou seis ciclos de clock.





Performance do microprocessador e tendências

O número de transistores disponível tem forte influência sobre a performance de um processador. Como vimos anteriormente, uma mera instrução em um processador 8088 era executada em 15 ciclos de clock. O 8088 levava aproximadamente 80 ciclos para realizar uma multiplicação de números de 16 bits, devido ao projeto do multiplicador, com o aumento do número de transistores, multiplicadores mais potentes tornaram-se possíveis e os processadores conseguiram realizar esta tarefa mais rapidamente.
O aumento da quantidade de transistores permitiu a criação de uma tecnologia chamada pipelining. Em uma arquitetura pipeline, as instruções de execução são realizadas simultaneamente. Mesmo que o processador leve cinco ciclos de clock para executar cada instrução, podem existir cinco instruções simultâneas em diferentes estágios de execução. Por esta razão, a impressão que temos é que cada instrução leva um ciclo de clock para ser realizada.
Muitos processadores modernos possuem múltiplos decodificadores de instrução, cada um com seu próprio pipeline, permite múltíplos canais de execução de instruções. Dessa forma, mais de uma instrução é realizada durante cada ciclo de clock. Esta técnica pode ser de difícil implementação e requer muitos transístores.
Novas tendências
A tendência inicial em projeto de processadores era: ULA com 32 bits, processadores rápidos de pontos flutuantes e execução pipeline com múltiplos canais de execução de instrução. A novidade são os processadores de 64 bits, de com até quatro núcleos de processamento e três níveis de memória cache (L1, L2 e L3). Outra tendência é a miniaturização do processo de fabricaçãos dos processadores, obtida com a evolução da nanotecnologia. Hoje o processo está em 45 nm, mas em breve os chips serão fabricados em 22nm. Quanto menor esse número, maior o número de transistoresexistentes em um processador.



Processador de 64 bits
Uma das razões pela qual o mundo precisa de processadores de 64 bits é o seu grande espaço de endereçamentos. O limite máximo de acesso à memória RAM em processadores de 32 bits é de 2 ou 4 GB. Parece ser bastante, já que a maioria dos computadores domésticos usa de  512 MB a 1 GB de memória RAM. Entretanto, um limite de 4 GB pode ser um grave problema para servidores e máquinas que gerenciam grandes bancos de dados. Em breve, até os computadores caseiros vão precisar de mais memória do que 2GB ou 4 GB. Um chip de 64 bits não tem restrições pelo fato de um endereçamento de espaço de memória RAM em 64 bits ser praticamente infinito para um futuro próximo. 2 elevado a 64 bytes de RAM é algo em torno de 1 bilhão de gigabytes de RAM.
Com um barramento de endereçamento e um barramento de dados em alta velocidade operando em placas-mãe de 64 bits, as máquinas também terão maior velocidade de entrada/saída e isso vai acelerar os discos rígidos e as placas de vídeo. Estes recursos vão aumentar drasticamente a performance dos computadores.
Os servidores certamente serão beneficiados com os 64 bits, mas e os usuários comuns?  As pessoas que trabalham com edição de vídeos e com grandes imagens serão beneficiadas por este tipo de computador. Os jogos modernos também irão melhorar, desde que sejam recodificados para tirar proveito dos recursos de 64 bits; mas o usuário comum que lê e-mails, navega na Internet e edita documentos de texto não precisa realmente deste tipo de processador





Nenhum comentário:

Postar um comentário