Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
05/12/2005

< Computadores XVI: Componentes da UCP >


Na coluna anterior, “O que é uma UCP”, vimos o que é Unidade Central de Processamento, o componente mais importante de nossos computadores. Hoje a examinaremos com um pouco mais de detalhes e discutiremos quais são e para que servem seus componentes internos.
Uma UCP pode ser concebida como um conjunto de quatro componentes básicos que funcionam harmonicamente: Unidade Aritmética e Lógica (UAL), registradores, unidade de controle e unidade de Entrada/Saída. Cada uma delas, por sua vez, é formada por diversos constituintes individuais. A função de todo este conjunto, como sabemos, é executar “instruções”, codificadas sob a forma de números.
Uma representação gráfica da UCP pode ser vista na Figura 1 com seus quatro componentes principais destacados. A unidade de entrada e saída é formada, nesta representação, pelos registradores REM e RDM e por suas ligações com os demais elementos (logo veremos as funções de cada um deles).

Figura 1: Representação gráfica de uma UCP


A execução de instruções envolve duas funções básicas: controle e processamento.
Consideram-se como de controle as atividades complementares, como busca de instruções e dados (que normalmente permanecem na memória principal), interpretação (decodificação) de instruções e comunicação com componentes externos (memória, entrada/saída).
Já o processamento é formado por atividades referentes à execução da instrução propriamente dita. Envolve predominantemente a execução de operações aritméticas e lógicas, execução de desvios (ou alteração do fluxo do programa), movimentação de dados entre posições de memória e UCP, entre UCP e memória e entre registradores e operações de entrada e saída (se tudo isso lhe parece um tanto complicado, não se preocupe: todos estes conceitos são simples e serão devidamente destrinchados na medida que avançarmos).
Unidade Aritmética e Lógica (UAL)
O principal componente interno da UCP envolvido nas funções relativas ao processamento é a Unidade Aritmética e Lógica (UAL). Que, como o nome indica, é a responsável pela execução de operações aritméticas e lógicas (não confundir “operação” com “instrução”; uma instrução é um procedimento que pode ser muito simples ou muito complexo, e neste último caso, pode englobar diversas operações).
Por exemplo, uma UAL é capaz de executar as seguintes operações:
- Somar, subtrair, multiplicar e dividir dois números.
- Executar operações lógicas como AND, OR e XOR com dois números;
- Executar operações unárias (ou seja, com um único operando, ou número) como complemento, incremento, decremento, deslocamento à direita e deslocamento à esquerda. Que são todas muito simples, apesar do nome aparentemente complicado. Incrementar e decrementar significam, respectivamente, somar e subtrair um. Deslocar à direita e à esquerda significa mover os bits uma casa para a direita (e abandonar o de ordem zero) ou esquerda (e acrescentar um zero à direita), o que corresponde a dividir e multiplicar por dois, respectivamente. E complementar significa “trocar” cada bit “um” por um bit “zero” e cada bit “zero” por um bit “um”.
Como muitas das operações executadas pela UAL exigem dois operandos (por exemplo: na soma de dois números, cada um deles é um operando), a UOL tem duas entradas. E como as operações em geral resultam em um único número, ela tem apenas uma saída (veja sua representação na figura).
A UAL consiste de uma combinação (que pode ser relativamente simples ou incrivelmente complexa) de componentes eletrônicos interligados em circuitos lógicos elementares que permitem executar as operações básicas acima. Uma tarefa que só parece complicada para quem não leu a coluna “Aprendendo a somar”, onde vimos como é fácil somar números empregando apenas circuitos lógicos.
Mas por mais complexa que seja uma UAL (como as capazes de executar as chamadas operações em “ponto flutuante”) ela é sempre uma combinação de circuitos simples que obedecem os mesmos princípios básicos de funcionamento.
Registradores
Quem leu a coluna “Circuitos impressos e integrados” sabe que a UCP, ou microprocessador, é apenas um circuito integrado, um componente eletrônico inserido em um circuito impresso. No caso de nossos computadores, este circuito impresso denomina-se “placa-mãe” e contém os principais elementos que compõem o micro. Inclusive, naturalmente, a UCP e a Memória Principal (ou MP), entre outros.
A memória principal é um imenso conjunto de “posições de memória”, cada uma capaz de armazenar um número binário (em geral de oito bits). Estas posições são numeradas seqüencialmente e estes números são conhecidos por “endereços” de memória. Então, se armazenarmos (“escrevermos”) um número em uma destas posições e anotarmos seu endereço, poderemos a qualquer momento retornar a ela e recuperar (“ler”) o número armazenado.
A MP funciona como um enorme depósito de números. Esses números tanto podem ser instruções de um programa (que, como vimos na coluna anterior, nada mais são que números binários), dados utilizados pelo programa ou até mesmo endereços de outras posições de memória (que, por sua vez, podem conter instruções, dados ou outros endereços).
Muitos dos operandos utilizados pela ULA estão originalmente armazenados na MP e muitos dos resultados das operações efetuadas pela ULA também deverão ser lá armazenados.
Ocorre, no entanto, que devido à arquitetura interna da UCP a UAL não tem acesso direto às posições da memória principal. Repare, na Figura 1, que a única comunicação que a UCP mantém com o mundo exterior (onde se situa a MP) se dá através do “barramento”, aquele conjunto de linhas coloridas em azul, verde e vermelho (assunto de uma das próximas colunas) que partem da unidade de controle (“barramento” de controle, representado pelas linhas vermelhas) e dos dois registradores RDM e REM (que fazem parte da unidade de entrada/saída que logo discutiremos), os barramento de dados e de endereços, formados pelas linhas verde e azuis, respectivamente (calma que logo veremos como isso funciona). E, como se nota pelas interligações dos elementos internos da UCP, a UAL só consegue se comunicar diretamente com o RDM, o REM e com o conjunto dos Registradores, que logo veremos o que são.
Em resumo: para que a UAL possa “enxergar” um número é preciso que ele esteja em um destes elementos situados no interior da UCP. Da mesma forma, como a UAL não se comunica diretamente com a memória principal, ela não pode lá escrever diretamente os resultados das operações por ela efetuadas (se isso lhe parece um tanto confuso, prometo esclarecer na próxima coluna, quando examinaremos o procedimento de leitura e escrita na memória principal).
Pois bem: os elementos conhecidos por “Registradores”, incluindo o RDM (Registrador de Dados da Memória) e REM (Registrador de Endereços da Memória) nada mais são que um conjunto de posições de memória internas às quais a UAL tem acesso direto, podendo ler e escrever dados em qualquer delas. Portanto, para que a UAL tenha acesso a um dado contido na MP, é preciso antes ler este dado e transcrevê-lo em um dos registradores.
Além de permitir que a UAL tenha acesso aos dados externos, os registradores funcionam como memória auxiliar da UCP, armazenando valores (dados e endereços) usados por algumas instruções, além de resultados intermediários. Nesses casos, os registradores servem como “rascunho” para a UCP durante a execução de instruções complexas.
Os registradores são posições de memória tão importantes que são identificados por nomes, não por endereços (números). Toda UCP tem dois registradores especiais, cujos nomes são Registrador de Instruções (RI) e Ponteiro de Instruções (PI) (cuja função examinaremos detalhadamente quando discutirmos o “ciclo de busca e execução”, ou seja, o conjunto de procedimentos adotado pela UCP para executar suas instruções). Além deles, toda UCP tem pelo menos mais um registrador, denominado Acumulador (ACC), cuja função principal é receber o resultado do processamento de instruções.
O número total de registradores de uma UCP, a função de cada um deles (alguns têm funções específicas, como o RI e PI, outros são de uso geral, como o ACC) e sua “largura” (quantidade de bits que pode armazenar), são fatores que dependem da arquitetura da UCP e são decididos pelo seu projetista.
Geralmente todos os registradores de uma UCP têm a mesma “largura”. E essa largura é um fator tão importante para o desempenho da UCP que em geral é usada para identificar o tipo da UCP (por exemplo: em geral quando dizemos que uma UCP é “de 32 bits” estamos na verdade dizendo que seus registradores são de 32 bits, ou seja, são capazes de armazenar quantidades que são expressas no sistema numérico de base dois por um número de 32 dígitos binários, ou bits).
A largura (quantidade de bits que pode armazenar) dos registradores de uma UCP é importante porque é um dos fatores usados para definir o tamanho da “palavra”. O outro é a largura do operando usado pela UAL.
A “Palavra” de uma UCP é, então, o número de bits que pode ser armazenado em um de seus registradores e que pode ser usado como operando pela UAL desta UCP (nem sempre esses valores são iguais; por exemplo: os processadores Pentium têm registradores de 64 bits mas suas ULA apenas podem utilizar números de 32 bits como operandos; nesse caso diz-se que os Pentium são processadores de 32 bits, adotando o menor dentre os dois valores para o tamanho da palavra).
O tamanho ou “largura” da palavra exerce influência decisiva no desempenho da UCP pelas seguintes razões:
- Quanto maior o tamanho da palavra, menor o tempo gasto para executar instruções com operandos (uma UCP com palavra de 32 bits pode somar dois números de quatro bytes em uma única operação, enquanto uma UCP de 8 bits precisa decompor a operação em uma série de passos intermediários).
- Quanto maior a palavra, maior a quantidade de bits (e, portanto, de bytes) transferida em cada operação de leitura ou escrita na memória e nos dispositivos de Entrada/Saída, o que faz com que rapidez com que se dá a leitura ou escrita de dados em grandes blocos de memória seja diretamente proporcional ao tamanho da palavra.
- Quanto maior o tamanho da palavra, maior o limite para a capacidade total da memória principal. Isto é conseqüência do fato de que os endereços devem ser armazenados nos registradores, que portanto devem ter capacidade para armazenar o maior de todos os endereços, que corresponde ao limite superior da capacidade da memória.
Unidade de Controle
Embora a principal atividade de uma UCP, o processamento de dados, seja executada pela ULA, ela não seria possível se a instrução não houvesse sido previamente decodificada, se os operandos não tivessem sido previamente escritos nos registradores e se os sinais de controle necessários para ativar os componentes auxiliares não tivessem sido emitidos. E estas funções são desempenhadas pela unidade de controle.
Na verdade a unidade de controle é a parte mais importante da UCP. Citando Mário A. Monteiro: “a área de controle é projetada para entender o que fazer, como fazer e comandar quem vai fazer no momento adequado. Podemos fazer uma analogia com os seres humanos imaginando que a área de controle é o cérebro que comanda o ato de andar, e a área de processamento são os músculos e ossos...”
Cada UCP dispõe de um repertório específico de instruções que é capaz de reconhecer e executar, denominado “conjunto de instruções” (“instruction set”). Cada instrução é identificada por um número. Para que cada uma delas seja executada, são implementados no interior da unidade de controle tantos circuitos lógicos independentes quantas são as instruções do conjunto de instruções. Quando a UCP recebe uma instrução para executar, é a unidade de controle que a “decodifica” e aciona o circuito correspondente.
Há dois tipos básicos de UCPs: aquelas cujo conjunto de instruções consiste de um número reduzido de instruções simples que podem ser executadas muito rapidamente (computadores de conjunto reduzido de instruções, Reduced Instruction Set Computer, ou RISC) e computadores com um conjunto complexo de instruções poderosas, porém de execução mais lenta (computadores de conjunto complexo de instruções, Complex Instruction Set Computers, ou CISC). Os computadores CISC foram desenvolvidos para facilitar a tarefa dos programadores, agrupando uma série de instruções elementares em instruções complexas e muito mais poderosas com o objetivo de otimizar o código dos programas. Modernamente, com a adoção quase universal das linguagens de programação “de alto nível”, a otimização dos programas é feita pelos programas denominados “compiladores”, que geram o código em linguagem de máquina. Por isto a tendência moderna é o desenvolvimento de microprocessadores RISC.
Para que uma instrução seja executada, basta ativar o circuito lógico correspondente. Quem executa esta ação é o “decodificador”.
O decodificador faz parte da unidade de controle. Sua função é “decodificar” a instrução, ou seja, receber na entrada o número que está armazenado no RI (e que, portanto, identifica a instrução a ser executada) e selecionar o circuito interno que contém as operações elementares que correspondem à sua execução. Se porventura você está lendo este texto na tela de um computador, o circuito decodificador da UCP que o equipa não é muito diferente daquele que você conhece, descrito na coluna “Multiplexadores, decodificadores e flip-flops”. Essencialmente, ambas as estruturas são análogas. A única diferença é que como o conjunto de instruções (“instruction set”) de seu computador contém um grande número de instruções, seu circuito decodificador terá muito mais que as oito saídas do circuito examinado na coluna citada.
Também faz parte da unidade de controle o temporizador, ou relógio (“clock”), que comanda o ritmo em que as operações elementares são realizadas (voltaremos a este assunto quando discutirmos a “Lógica Temporizada”).
A função do temporizador é gerar pulsos de tensão de duração fixa e em um ritmo constante. Em geral isso é feito através do emprego de um cristal de quartzo, um componente capaz de emitir pulsos de tensão a intervalos notavelmente precisos.
O número de pulsos gerados na unidade de tempo define a “freqüência de operação” da UCP, medida em múltiplos da unidade de freqüência Hertz (KHz, MHz e GHz). Este parâmetro é tão importante que durante muito tempo foi usado para definir a classe da UCP (por exemplo: um Pentium 800 referia-se a um microprocessador Pentium, da Intel, que operava a uma freqüência de 800 MHz). Ultimamente os fabricantes decidiram adotar “números de código” para identificar suas UCPs, porém a freqüência de operação ainda é um fator importante na avaliação do desempenho do microprocessador.
O intervalo de tempo decorrido entre o início de um pulso e o início do pulso seguinte denomina-se ciclo de relógio ou ciclo de maquina. Em princípio, não pode existir qualquer operação realizada pela UCP que dure menos que um ciclo de máquina. Portanto, nenhuma instrução pode durar menos que um ciclo. Em geral dura mais, já que as instruções, após decodificadas, são decompostas em uma seqüência de operações elementares, cada uma durando um ciclo de máquina.
Esse princípio básico continua válido mesmo nos dias de hoje. Porém, com a evolução dos microprocessadores, surgiram as arquiteturas em “pipeline” (onde diversas instruções são executadas simultaneamente, cada uma em um estágio diferente da UCP), superescalares (UCPs que adotam mais de uma “pipeline” no mesmo núcleo) e multinucleares (UCPs que contêm mais de um núcleo no mesmo encapsulamento). Estas arquiteturas permitem que diversas instruções sejam executadas no mesmo ciclo, cada uma em seu “nicho”. Por isso, se você dividir o tempo gasto para executar diversas instruções simultaneamente pela duração do ciclo de máquina pode obter um número fracionário, parecendo indicar que a instrução foi executada em menos de um ciclo. Isso, no entanto, é meramente um dado estatístico e não reflete a realidade. Por mais que a tecnologia evolua, em cada estágio de uma pipeline de cada núcleo, nada pode durar menos que um ciclo de máquina (se este parágrafo lhe pareceu difícil de entender, simplesmente esqueça-o; quando discutirmos os tipos de arquitetura acima mencionados, os conceitos se tornarão mais claros e aquele “aha!” aparecerá em sua boca, juntamente com o sorriso que costuma enfeitar nossa fisionomia quando, enfim, entendemos um conceito mais “cabeludo”).
A duração de um ciclo de máquina é igual ao inverso da freqüência de operação. Assim, em uma UCP operando a 500 MHz (quinhentos milhões ciclos por segundo) a duração do ciclo de máquina é de 1/500.000.000 = 0,000000002 seg, ou 2 ns. E pela mesma razão os ciclos de máquina de uma UCP operando a 1 GHz (um bilhão de ciclos por segundo) duram 1 ns (1 nanossegundo, ou um bilionésimo do segundo).
Os principais elementos de uma unidade de controle são então o circuito decodificador, o conjunto de circuitos responsáveis pela execução de cada instrução (também conhecido por “microcódigo”) e o temporizador.
Unidade de Entrada e Saída
A unidade de Entrada/Saída (da UCP) é o elo de ligação entre ela e o “mundo exterior”, ou seja, o restante do circuito do computador. Essencialmente ela comunica a UCP com a memória principal e com os dispositivos de Entrada e Saída do computador (não confundir com a unidade de E/S da própria UCP).
Como vimos acima, a UCP é ligada ao mundo exterior por três barramentos distintos: o de dados, o de endereços e o de controle. Os dois primeiros transportam valores correspondentes, respectivamente, a dados e endereços e o terceiro os sinais de controle.
A unidade de Entrada/Saída (E/S ou I/O, de “Input/Output”) tem duas funções básicas. A primeira é transferir valores (endereços ou dados) entre os componentes externos e os internos da UCP. A segunda é adequar os sinais de controle para transitar de dentro para fora da UCP e vice-versa, pois os componentes internos da UCP são delicados e não suportariam as tensões e correntes elétricas usadas para transportar os sinais através do barramento.
Enquanto os circuitos internos da UCP se comunicam diretamente com o barramento de controle através da unidade de E/S, a comunicação com os barramentos de dados e endereços é feita através de dois registradores específicos que fazem parte da unidade de E/S, o Registrador de Dados da Memória (RDM) e Registrador de Endereços da Memória (REM), respectivamente.
A unidade de E/S pode ser simples, composta apenas pelos registradores REM, RDM e de um amortecedor de sinais, até unidades muito complexas, que incluem cache de memória interno (ou de nível 1, como veremos adiante) e multiplicadores de freqüência (nas UCP modernas, que operam com freqüência diferente da do barramento).
Portanto...
estes são os componentes principais de uma UCP. Nas próximas colunas veremos como eles se combinam harmonicamente para executarem operações como leitura/escrita na memória, busca e execução de instruções e coisas que tais.
Até lá.

B. Piropo