# Microprocessador

O microprocessador, geralmente chamado apenas de processador, é um circuito integrado que realiza as funções de cálculo e tomada de decisão de um computador. Todos os computadores e equipamentos eletrônicos baseiam-se nele para executar suas funções, podemos dizer que o processador é o cérebro do computador por realizar todas estas funções.
Um microprocessador incorpora as funções de uma unidade central de computação (CPU) em um único circuito integrado, ou no máximo alguns circuitos integrados. É um dispositivo multifuncional programável que aceita dados digitais como entrada, processa de acordo com as instruções armazenadas em sua memória, e fornece resultados como saída. Microprocessadores operam com números e símbolos representados no sistema binário.
O microprocessador é um circuito integrado formado por uma camada chamada de mesa epitaxial de silício, trabalhada de modo a formar um cristal de extrema pureza, laminada até uma espessura mínima com grande precisão, depois cuidadosamente mascarada por um processo fotográfico e dopada pela exposição a altas temperaturas em fornos que contêm misturas gasosas de impurezas. Este processo é repetido tantas vezes quanto necessário à formação da microarquitetura do componente.
Responsável pela execução das instruções num sistema, o microprocessador, escolhido entre os disponíveis no mercado, determina, em certa medida a capacidade de processamento do computador e também o conjunto primário de instruções que ele compreende. O sistema operativo é construído sobre este conjunto.
O próprio microprocessador subdivide-se em várias unidades, trabalhando em altas freqüências. A ULA (Unidade Lógica e Aritmética), unidade responsável pelos cálculos aritméticos e lógicos e os registradores são parte integrante do microprocessador na família x86, por exemplo.
Embora seja a essência do computador, o microprocessador diferente do microcontrolador, está longe de ser um computador completo. Para que possa interagir com o utilizador precisa de: memória, dispositivos de entrada/saída, um clock, controladores e conversores de sinais, entre outros. Cada um desses circuitos de apoio interage de modo peculiar com os programas e, dessa forma, ajuda a moldar o funcionamento do computador.

## História

O primeiro microprocessador comercial foi projetado pela Intel em 1971 para atender uma empresa japonesa que precisava de um circuito integrado especial para as suas atividades. A Intel projectou o 4004, que era um circuito integrado programável que trabalhava com registradores de 4 bits, 46 instruções, clock de 740 kHz e possuía cerca de 2 300 transistores. Percebendo a utilidade desse invento a Intel prosseguiu com o desenvolvimento de novos microprocessadores: 8008 (o primeiro de 8 bits) e a seguir o 8080 e o microprocessador 8085. O 8080 foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de 1970 graças ao sistema operacional CP/M. Da Intel saíram alguns funcionários que fundaram a Zilog, que viria a lançar o microprocessador Z80, com instruções compatíveis com o 8080 (embora muito mais poderoso que este) e também de grande sucesso. A Motorola possuía o 68000 e a MOS Technology o 6502. A Motorola ganhou destaque quando implantou o MC68000P12, de 12 MHz com arquitetura de 32 bits (embora seu barramento de dados fosse de 24 bits e o de endereços de 16 bits), no Neo-Geo, um poderoso Arcade da SNK que posteriormente ganharia a versão AES (console casero) e CD (versão CD), todos eles com o mesmo hardware inicial.
Todos os microprocessadores de 8 bits foram usados em muitos computadores pessoais (Sinclair, Apple Inc., TRS, Commodore, etc).
Em 1981 a IBM decidiu lançar-se no mercado de computadores pessoais e no seu IBM-PC utilizou um dos primeiros microprocessadores de 16 bits, o 8088 (derivado do seu irmão 8086 lançado em 1978) que viria a ser o avô dos computadores atuais. A Apple nos seus computadores Macintosh utilizava os processadores da Motorola, a família 68000 (de 32 bits).
Outros fabricantes também tinham os seus microprocessadores de 16 bits, a Zilog tinha o Z8000, a Texas Instruments o TMS9900, a National Semiconductor tinha o 16032, mas nenhum fabricante teve tanto sucesso como a Intel, que sucessivamente foi lançando melhoramentos na sua linha 80X86, tendo surgido assim (por ordem cronológica) o 8086, 8088, 80186, 80188, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium MMX, Pentium II, Pentium III, Pentium IV, Pentium M, Pentium D, Pentium Dual Core, Core 2 Duo, Core 2 Quad, Core i3, Core i5, Core i7 e Core i9. Para o IBM-AT foi utilizado o 80286, depois um grande salto com o 80386 que podia trabalhar com memória virtual e multitarefa, o 80486 com coprocessador matemático embutido e finalmente a linha Pentium, com pipeline de processamento.
Como grande concorrente da Intel, a AMD aparece inicialmente como fabricante de microprocessadores da linha x86 alternativa mas a partir de um certo momento deixou de correr atrás da Intel e partiu para o desenvolvimento de sua própria linha de microprocessadores: K6, Athlon, Duron, Turion, Sempron, Phenom.
Paralelamente à disputa entre Intel e AMD, a IBM possuía a linha PowerPC utilizada principalmente pelos microcomputadores da Apple.
A evolução tecnológica envolvida é surpreendentemente grande, de microprocessadores que trabalhavam com clock de dezenas de KHz e que podiam processar alguns milhares de instruções por segundo, atingiu-se clocks na casa dos 7 GHz e poder de processamento de dezenas de bilhões de instruções por segundo. A complexidade também cresceu: de alguns milhares de transístores para centenas de milhões de transístores numa mesma pastilha.
O CPU tem como função principal unificar todo o sistema, controlar as funções realizadas por cada unidade funcional, e é também responsável pela execução de todos os programas do sistema, que deverão estar armazenados na memória principal.

## Componentes

O processador é composto por alguns componentes, cada um tendo uma função específica no processamento dos programas.

### Unidade lógica e aritmética

A Unidade lógica e aritmética (ULA) é a responsável por executar efetivamente as instruções dos programas, como instruções lógicas, matemáticas, desvio, etc.

### Unidade de controle

A Unidade de controle (UC) é responsável pela tarefa de controle das ações a serem realizadas pelo computador, comandando todos os outros componentes.

### Registradores

Os registradores são pequenas memórias velozes que armazenam comandos ou valores que são utilizados no controle e processamento de cada instrução.
Os registradores mais importantes são:
* Apontador de Instruções (PC) – Guarda o endereço da próxima instrução a ser executada;
* Registrador de Instrução (RI) – Armazena a instrução que está sendo executada;
* Apontador de Pilha (SP) – Guarda o endereço da pilha de execução do programa.

### Unidade de Gerenciamento de Memória

A MMU (em inglês: Memory Management Unit) é um dispositivo de hardware que transforma endereços virtuais em endereços físicos e dá suporte para o sistema operacional administrar a alocação da memória principal do computador entre os diversos programas em execução no computador.

### Unidade de ponto flutuante

Nos processadores atuais são implementadas unidades de cálculo de números reais. Tais unidades são mais complexas que ULAs e trabalham com operandos reais, também chamados de ponto flutuante, com tamanhos típicos variando entre 32, 64 e 128 bits.

## Frequência de operação

O relógio do sistema (Clock) é um circuito oscilador a cristal (efeito piezoelétrico) que tem a função de sincronizar e ditar a medida de tempo de transferência de dados no computador. Esta freqüência é medida em ciclos por segundo, ou Hertz.
A capacidade de processamento do processador não está relacionada exclusivamente à frequência do relógio, mas também a outros fatores como: largura dos barramentos, quantidade de memória cache, arquitetura do processador, tecnologia de co-processamento, tecnologia de previsão de saltos (branch prediction), tecnologia de pipeline, conjunto de instruções, etc.
O aumento da frequência de operação nominal do processador é denominado overclocking.

## Arquitetura

Existem duas principais arquiteturas usadas em processadores:
* A arquitetura de Von Neumann. Esta arquitetura caracteriza-se por apresentar um barramento externo compartilhado entre memória de dados e memória de programa. Embora apresente baixo custo, esta arquitetura apresenta desempenho limitado pelo gargalo do barramento;
* A arquitetura de Harvard. Nesta arquitetura existem dois barramentos externos independentes (e normalmente também memórias independentes) para dados e instruções. Isto reduz de forma sensível o gargalo de barramento, que é uma das principais barreiras de desempenho, em detrimento do encarecimento do sistema como um todo.

## Modelos de computação

Existem dois modelos de computação usados em processadores:
* CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; possui um grande conjunto de instruções (tipicamente centenas) que são armazenadas em uma pequena memória não-volátil interna ao processador. Cada posição desta memória contém as microinstruções, ou seja, os passos a serem realizados para a execução de cada instrução. Quanto mais complexa a instrução, mais microinstruções ela possuirá e mais tempo levará para ser executada. Ao conjunto de todas as microinstruções contidas no processador denominamos microcódigo. Esta técnica de computação baseada em microcódigo é denominada microprogramação;
* RISC (em inglês: Reduced Instruction Set Computing, Computador com um Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple, Motorola e IBM), SPARC (SUN), MIPS, ARM e RISC-V; possui um conjunto pequeno de instruções (tipicamente algumas dezenas) implementadas diretamente em hardware. Nesta técnica não é necessário realizar a leitura em uma memória e, por isso, a execução das instruções é muito rápida (normalmente um ciclo de clock por instrução). Por outro lado, as instruções são muito simples e para a realização de certas tarefas são necessárias mais instruções que no modelo CISC.
Com o passar do tempo, as características de um modelo passaram também a serem incorporadas ao outro, tanto aumentando o número de instruções das arquiteturas RISC, em especial com as extensões vetoriais como NEON do ARM, quanto simplificando o processo de execução das arquiteturas CISC, onde mais de um tipo de decodificador de instrução permite a decodificação e execução rápida das instruções simples, deixando o microcódigo apenas para as instruções mais complexas.

## Exemplos de microprocessadores

* Microprocessadores — São utilizados nos computadores pessoais, onde são chamadas de Unidade Central de Processamento (CPU), workstations e mainframes. Podem ser programados para executar as mais variadas tarefas.
* Processadores Digitais de Sinal (DSP do inglês Digital Signal Processor) — são microprocessadores especializados em processamento digital de sinal usados para processar sinais de áudio, vídeo, etc., quer em tempo real quer em off-line. Estão presentes, por exemplo, em aparelhos de CD, DVD e televisores digitais. Em geral, realizam sempre uma mesma tarefas simples.
* Microcontroladores — Processadores relativamente flexíveis, de relativo baixo custo, que podem ser utilizados em projetos de pequeno tamanho. Podem trazer facilidades como conversores A/D embutidos, ou um conjunto de instruções próprias para comunicação digital através de algum protocolo específico.
* GPU — (ou Unidade de Processamento Gráfico), é um microprocessador especializado em processar gráficos. São utilizadas em placas de vídeo para fazer computação gráfica.

## Propósito geral e dedicado

Durante o processo de desenvolvimento do design de um processador, uma das características que se leva em conta é o uso que ele se destina. Processadores gráficos e controladoras por exemplo não tem o mesmo fim que um processador central.
Processadores de propósito geral podem executar qualquer tipo de software, embora sua execução seja mais lenta que o mesmo sendo executado em um processador especializado.
Processadores dedicados são fabricados para executarem tarefas específicas, como criptografia, processamento vetorial e gráfico, sendo nesse caso bem mais rápidos do que processadores de propósito geral em tarefas equivalentes.
No caso do processamento gráfico, existem as GPUs, que são microprocessadores geralmente com memória dedicada e especialmente desenvolvidos para cálculos gráficos.
Nem sempre os processadores seguem definidamente esses dois modelos, sendo o motivo disso que muitos processadores modernos incorporam processadores especializados (co-processador), para cálculos de criptografia, processamento de vetores, etc..

## Processadores multinucleares

Até há poucos anos usaram-se microprocessadores para atividades domésticas ou de negócios com simples núcleo. Atualmente são utilizados microprocessadores de múltiplos núcleos para melhorar a capacidade de processamento. Espera-se que no futuro os sistemas operacionais domésticos sejam compilados para trabalhar com processadores de múltiplos núcleos corretamente, realizando assim inúmeras tarefas ao mesmo tempo (como já acontece com os supercomputadores).

## Sistemas multiprocessador

Em muitos sistemas o uso de um só processador é insuficiente. A solução nesses casos é usar dois ou mais processadores em multi processamento, aumentando assim a quantidade de processadores disponíveis ao sistema operacional.
Sistemas multiprocessados podem ser de basicamente dois tipos:
* Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal.
* Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória.

## Capacidade de processamento

A capacidade de processamento de um microprocessador é de certa forma difícil de medir, uma vez que esse desempenho pode se referir a quantidade máxima teórica de instruções que podem ser executadas por segundo, que tipos de instruções são essas, em Flops (instruções de ponto flutuante por segundo), podendo essa ser de precisão simples, dupla, quádrupla, dependendo do contexto, e em MIPS (milhões de instruções por segundo), sendo essas operações com números inteiros.
Somente a capacidade máxima teórica de um microprocessador não define seu desempenho, somente dá uma noção da sua capacidade, uma vez que sua arquitetura, barramento com a memória, entre outros, também influenciam no seu desempenho final. Sendo assim, sua capacidade de processamento é medida comparando-se a velocidade de execução de aplicativos reais, podendo-se assim, testar seu desempenho em atividades comuns.